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

Chuyển đổi ‘datetime2’ 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 datetime2 giá trị thành bộ datetimeoffset giá trị trong SQL Server.

Khi bạn chuyển đổi datetime2 giá trị thành datetimeoffset , giá trị kết quả sẽ phụ thuộc vào độ chính xác giây phân số được chỉ định cho từng loại dữ liệu, cũng như bất kỳ độ lệch múi giờ nào bạn chỉ định.

Cả hai loại dữ liệu đều cho phép bạn chỉ định độ chính xác giây theo phân số từ 0 đến 7. Nếu bạn không chỉ định điều này, tỷ lệ mặc định là 7 sẽ được sử dụng.

datetimeoffset kiểu dữ liệu bao gồm độ lệch múi giờ và có thể bảo toàn bất kỳ hiệu số nào trong giá trị ban đầu. Tuy nhiên, datetime2 không có nhận thức về múi giờ, vì vậy không có những giá trị hiện có để bảo tồn. Trong trường hợp này, độ lệch múi giờ mặc định là +00:00.

TODATETIMEOFFSET() hàm được thiết kế đặc biệt để chuyển đổi giá trị ngày / giờ thành datetimeoffset và thêm độ lệch múi giờ. Tuy nhiên, hãy xem nhận xét của tôi (và các ví dụ) bên dưới về tùy chọn này.

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

Đầu tiên, đây là một ví dụ về chuyển đổi ngầm định giữa datetime2 datetimeoffset .

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Kết quả:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Đâ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 (như những hàm bên dưới) để chuyển đổi nó một cách rõ ràng. Trong trường hợp này, SQL Server thực hiện một chuyển đổi ẩn đằng sau hậu trường khi chúng tôi cố gắng gán datetime2 giá trị thành bộ datetimeoffset biến.

Chúng ta có thể thấy rằng bộ datetimeoffset biến có thể sử dụng cùng độ chính xác với datetime2 giá trị (7 chữ số thập phân). Chúng tôi cũng kết thúc với độ lệch múi giờ là +00:00 .

Việc sử dụng độ chính xác của 7 giây phân số gây ra bộ datetimeoffset sử dụng 11 byte để lưu trữ (10 cho dữ liệu và 1 byte cho độ chính xác). datetime2 kiểu sử dụng 9 byte (8 cho dữ liệu và 1 byte cho độ chính xác) khi sử dụng thang điểm 7.

Tuy nhiên, bạn có thể giảm độ chính xác bằng cách thay thế số 7 bằng một số thấp hơn.

Ví dụ 2 - Làm tròn

Nếu datetimeoffset có độ chính xác thấp hơn datetime2 giá trị, nó sẽ được làm tròn.

Đây là một ví dụ:

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(6);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2(7)',
  @thedatetimeoffset AS 'datetimeoffset(6)';

Kết quả:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

Trong ví dụ này, datetime2 giá trị có thang điểm là 7 nhưng datetimeoffset quy mô của giá trị chỉ là 6. Do đó, độ chính xác của nó chỉ đến 6 chữ số thập phân và chữ số thứ sáu của nó được làm tròn thành 7 (thay vì 6).

Ví dụ 3 - 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 giữa datetime2 datetimeoffset .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';

Kết quả:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

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

Dưới đây là một ví dụ về chuyển đổi rõ ràng bằng cách sử dụng CONVERT() hàm thay vì CAST() .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Kết quả:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Ví dụ 5 - Thay đổi Chênh lệch múi giờ

Nếu bạn đang chuyển đổi từ datetime2 đến datetimeoffset , bạn có thể đang làm điều đó để bù lệch múi giờ. Cũng có khả năng cao là bạn sẽ cần một giá trị khác với giá trị mặc định +00:00.

May mắn thay, bạn có thể sử dụng TODATETIMEOFFSET() chức năng thay đổi độ lệch.

Bạn cũng có thể sử dụng chức năng này để chuyển đổi datetime2 ban đầu giá trị thành bộ datetimeoffset giá trị. Hàm này chấp nhận bất kỳ giá trị ngày / giờ nào có thể phân giải thành datetime2 giá trị và một giá trị bù đắp.

Đây là một ví dụ:

DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime2, '+07:00');
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset';

Kết quả:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Và đây là một ví dụ sử dụng hàm trong SELECT tuyên bố:

DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetimeoffset';

Kết quả:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Một điểm quan trọng về TODATETIMEOFFSET() là nó sử dụng cùng một độ chính xác phân số như đối số ngày / giờ được truyền cho nó.

Do đó, nếu datetime2 của bạn sử dụng độ chính xác thấp hơn datetimeoffset , bạn luôn có thể gán lại nó cho một biến có độ chính xác cao hơn, sau đó chuyển giá trị đã chuyển đổi đó sang TODATETIMEOFFSET() .

Ví dụ:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Kết quả (sử dụng đầu ra dọc):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapper.NET và proc được lưu trữ với nhiều bộ kết quả

  2. Tại sao NULL =NULL đánh giá thành false trong máy chủ SQL

  3. Tìm các đối tượng bị hỏng trong SQL Server

  4. Chèn Cập nhật proc được lưu trữ trên SQL Server

  5. Các ràng buộc có thể hoãn lại trong SQL Server