Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chuyển đổi ‘time’ thành ‘datetimeoffset’ trong SQL Server (Ví dụ T-SQL)

Bài viết này chứa các ví dụ về chuyển đổi thời gian giá trị thành bộ datetimeoffset giá trị trong SQL Server bằng Transact-SQL.

Khi bạn chuyển đổi thời gian giá trị thành datetimeoffset , ngày được đặt thành ‘1900-01-01’ và thời gian được sao chép. Độ lệch múi giờ được thêm và đặt thành +00:00.

Ví dụ 1 - Chuyển đổi rõ ràng bằng CAST ()

Dưới đây là một ví dụ về chuyển đổi rõ ràng. Trong trường hợp này, tôi sử dụng CAST() hoạt động trực tiếp trong SELECT tuyên bố để chuyển đổi rõ ràng từ thời gian đến datetimeoffset .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset) AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Vì vậy, một phần ngày tháng được thêm vào và đặt thành '1900-01-01', thời gian được sao chép và độ lệch múi giờ được thêm vào và đặt thành +00:00.

Ví dụ 2 - Độ chính xác

Trong ví dụ trước, cả hai kiểu dữ liệu đều sử dụng độ chính xác / tỷ lệ mặc định của chúng (7). Điều này là do tôi không thêm tỷ lệ trong ngoặc (tỷ lệ xác định độ chính xác của phân số giây). Bằng cách sử dụng thang điểm 7, chúng ta có thể thấy rằng cả hai kiểu dữ liệu đều có thể biểu diễn giá trị thời gian chính xác đến 7 chữ số thập phân.

Nói cách khác, khi ban đầu tôi đặt @thetime biến, tôi đã bao gồm 7 chữ số thập phân trong giá trị (cụ thể là 1234567 ). Cả hai loại dữ liệu "time" và "datetimeoffset" đều có thể đại diện thành công vì chúng đều sử dụng thang điểm 7. Một lần nữa, chúng tôi biết chúng đã sử dụng 7 vì đó là giá trị mặc định.

Chỉ cần rõ ràng, thang đo là số chữ số ở bên phải dấu thập phân của một số. Độ chính xác là tổng số chữ số trong số.

Chúng tôi có thể giảm độ chính xác của phân số giây nếu cần.

Dưới đây là một số ví dụ minh họa điều gì sẽ xảy ra khi các kiểu dữ liệu được đặt để sử dụng độ chính xác giây phân số khác nhau:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.0000000 +00:00 |
+------------------+------------------------------------+

Trong trường hợp này, tôi đặt @thetime một cách rõ ràng biến để sử dụng thang điểm 7. Nhưng khi tôi chuyển giá trị này thành datetimeoffset , Tôi đã đặt tỷ lệ thành 0. Do đó, kết quả cho bộ datetimeoffs giá trị nhỏ hơn độ chính xác phân số giây. Trên hệ thống của tôi, 7 chữ số thập phân vẫn được hiển thị, nhưng tất cả đều bằng 0.

Đây là một lần nữa, nhưng lần này tôi tăng độ chính xác của phân số giây lên 3 cho datetimeoffset giá trị:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(3)) AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1230000 +00:00 |
+------------------+------------------------------------+

Vì vậy, nó sử dụng 3 phần giây đầu tiên (mili giây).

Tuy nhiên, nếu chúng tôi tăng độ chính xác của phân số giây lên 4, hãy xem điều gì sẽ xảy ra:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(4)) AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

Trong ví dụ tiếp theo, tôi tăng giá trị của phần phân số để nó tạo ra phần không phải là phân số của datetimeoffset giá trị được làm tròn:

DECLARE @thetime time(7);
SET @thetime = '23:15:59.7654321';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.7654321 | 1900-01-01 23:16:00.0000000 +00:00 |
+------------------+------------------------------------+

Trong trường hợp này, phút được làm tròn và giây được đặt thành 0.

Hãy hoán đổi nó để có datetimeoffset có độ chính xác cao hơn thời gian giá trị:

DECLARE @thetime time(4);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(7)) AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1235000 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

Tôi đã khai báo @thetime biến để sử dụng thang điểm 4, nhưng sau đó đã sử dụng thang điểm 7 khi chuyển đổi nó thành datetimeoffset loại dữ liệu. Sử dụng độ chính xác 7 là không cần thiết, vì nó không thể sử dụng độ chính xác cao hơn giá trị đã được chỉ định.

Ngoài ra, bất kỳ phép làm tròn nào có độ chính xác thấp hơn đã xảy ra vào thời điểm nó được chuyển đổi thành bộ datetimeoffset (độ chính xác cao hơn) loại dữ liệu. Lưu ý rằng thời gian kiểu dữ liệu đã làm tròn số giây phân số lên từ giá trị ban đầu mà tôi đã gán cho nó. Hiệu ứng làm tròn này cũng chuyển qua bộ ngày giờ giá trị.

Ví dụ 3 - Chuyển đổi rõ ràng bằng CONVERT ()

Đây là một ví dụ sử dụng CONVERT() hàm thay vì CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(datetimeoffset, @thetime) AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Ví dụ 4 - Chuyển đổi ngầm định

Dưới đây là một ví dụ về việc thực hiện điều tương tự, nhưng sử dụng chuyển đổi kiểu ngầm định.

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Vì vậy, chúng tôi nhận được cùng một kết quả, bất kể đó là chuyển đổi rõ ràng hay ẩn.

Đây là một chuyển đổi ngầm định bởi vì chúng tôi không sử dụng một hàm chuyển đổi để chuyển đổi một cách rõ ràng. Chúng tôi chỉ đơn giản là chỉ định giá trị từ một biến của một kiểu dữ liệu cho một biến của một kiểu dữ liệu khác. Trong trường hợp này, SQL Server thực hiện chuyển đổi ngầm ẩn khi chúng tôi cố gắng ấn định thời gian giá trị thành bộ datetimeoffset biến.

Ví dụ 5 - Thay đổi ngày

Nếu bạn cần thay đổi ngày (nhưng giữ nguyên thời gian), bạn có thể sử dụng DATEADD() hàm số.

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SET @thedatetimeoffset = DATEADD(year, 285, @thedatetimeoffset);
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Kết quả:

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 2185-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Trong trường hợp này, tôi thêm 285 vào giá trị năm, điều này đưa nó thành 2185.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để tìm ra những gì đang khóa bảng của tôi?

  2. Tại sao 1899-12-30 là ngày 0 trong Access / SQL Server thay vì 12/31?

  3. SqlDataSourceEnumerator.Instance.GetDataSources () không định vị phiên bản SQL server 2008 cục bộ

  4. Lỗi CTE:Các loại không khớp giữa phần neo và phần đệ quy

  5. SQL JOIN so với IN hiệu suất?