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

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

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

Ngày giờ kiểu dữ liệu có tối đa 3 chữ số cho phần giây phân số của nó. Độ chính xác của nó được làm tròn đến gia số .000, .003 hoặc .007 giây.

datetimeoffset Mặt khác, kiểu dữ liệu cho phép bạn chỉ định độ chính xác giây phân số từ 0 đến 7. Nếu bạn không chỉ định điều này, nó sẽ sử dụng 7 (mặc định). Nó cũng có độ lệch múi giờ và có thể bảo toàn bất kỳ sự chênh lệch nào ở giá trị ban đầu. Tuy nhiên, ngày giờ 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.

SQL Server thực sự có TODATETIMEOFFSET() , đượ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, có một chi tiết nhỏ cần lưu ý khi sử dụng chức năng này và tôi giải thích điều này bên dưới (kèm theo ví dụ).

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 ngày giờ datetimeoffset .

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Kết quả:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +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 chỉ định datetime giá trị thành bộ datetimeoffset biến.

Chúng ta có thể thấy rằng bộ datetimeoffset biến có độ chính xác giây phân số nhiều hơn và chúng tôi kết thúc bằng một phần phân số của 1233333 (so với 123 cho ngày giờ giá trị). 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 10 byte để lưu trữ (11 byte nếu bạn bao gồm byte lưu trữ độ chính xác của nó). Theo cách so sánh, ngày giờ chỉ sử dụng 8 byte. Tuy nhiên, bạn có thể giảm độ chính xác của bộ datetimeoffset giá trị bằng cách thay thế 7 bằng một số thấp hơn. Đây là khái niệm giống như khi sử dụng datetime2 loại dữ liệu. Xem Chuyển đổi ‘datetime’ thành ‘datetime2’ trong SQL Server để biết ví dụ về cách điều này có thể ảnh hưởng đến kết quả cuối cùng.

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

Ngày giờ kiểu dữ liệu được làm tròn đến gia số .000, .003 hoặc .007 giây. Ngay cả khi bạn đặt nó thành một giá trị khác một cách rõ ràng, nó sẽ được làm tròn. Điều này có thể khiến bạn bối rối nếu bạn không biết cách hoạt động của nó. Nó không chỉ có thể gây nhầm lẫn khi sử dụng datetime tự nó, nó có thể gây thêm nhầm lẫn khi chuyển đổi giá trị đó sang một kiểu dữ liệu khác.

Đây là một ví dụ chứng minh ý tôi muốn nói.

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Kết quả:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Trong ví dụ này, tôi đặt giây phân số thành 125 nhưng ngày giờ làm tròn nó thành 127 (vì kiểu dữ liệu này chỉ có thể được làm tròn đến gia số .000, .003 hoặc .007 giây).

datetimeoffset mặt khác, hãy đặt giây phân số thành 1266667 .

Tuy nhiên, nếu chúng tôi chỉ đặt giá trị ban đầu thành datetimeoffset ngay từ đầu, phần phân số của nó sẽ trả về 1250000 .

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 datetime datetimeoffset .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Kết quả:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +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 @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';

Kết quả:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

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

Nếu bạn gặp khó khăn trong việc chuyển đổi ngày giờ của mình giá trị của datetimeoffset , bạn có thể cần bù múi giờ. Và rất có thể bạn muốn nó được đặt thành thứ gì đó khác ngoài +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 ngày giờ ban đầu giá trị thành bộ datetimeoffset giá trị. Hàm này chấp nhận một giá trị ngày / giờ (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 @thedatetime datetime, @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime, '+07:00');
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset';

Kết quả:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

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

DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';

Kết quả:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +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ó. Trong trường hợp này, đó là ngày giờ , vì vậy nó có thang điểm là 3 (tức là 3 giây phân số). Đây có thể là một vấn đề đối với bạn. Nếu đúng như vậy, bạn luôn có thể chuyển đổi nó thành datetimeoffset trước tiên, sau đó chuyển giá trị đã chuyển đổi đó sang TODATETIMEOFFSET() .

Ví dụ:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

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

datetime       | 2025-05-21 10:15:30.127
datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00
Modified       | 2025-05-21 10:15:30.1266667 +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. Lệnh SQL INSERT đang hoạt động nhưng dữ liệu không xuất hiện trong bảng

  2. 2 cách tạo cơ sở dữ liệu trên máy chủ được liên kết bằng T-SQL

  3. tách chữ và số bằng sql

  4. Thống kê gia tăng SQL Server 2014

  5. Giới hạn mệnh đề IN trong Sql Server