Bài viết này chứa các ví dụ về chuyển đổi smalldatetime giá trị thành bộ datetimeoffset giá trị trong SQL Server.
Khi bạn chuyển đổi smalldatetime giá trị thành datetimeoffset , smalldatetime giá trị được sao chép vào datetimeoffset giá trị. Các giây phân số được đặt thành 0 và độ lệch múi giờ được đặt thành +00:0.
smalldatetime kiểu dữ liệu không có giây phân số nào và thành phần giây của nó luôn được đặt thành 0 (:00). Độ chính xác của nó chính xác đến từng phút.
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, smalldatetime 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ờ được đặt thành +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, hãy xem bên dưới để biết nhận xét của tôi và một số ví dụ 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 smalldatetime và datetimeoffset .
DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetimeoffset = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetimeoffset AS 'datetimeoffset(7)';
Kết quả:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset(7) | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 smalldatetime giá trị thành bộ datetimeoffset biến.
Chúng ta có thể thấy rằng bộ datetimeoffset biến có một phần phân số ( 0000000 ), trong khi smalldatetime giá trị không có phần phân số và số phút của nó được làm tròn khi gán giá trị ban đầu cho nó. datetimeoffset giá trị cũng bao gồm độ 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 byte để lưu trữ dữ liệu, 1 byte cho độ chính xác). Trong khi đó, smalldatetime chỉ sử dụng 4 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. Nếu bạn muốn xóa hoàn toàn phần giây phân số, chỉ cần sử dụng datetimeoffset(0)
. Làm điều này sẽ giảm kích thước lưu trữ xuống còn 9 byte (bao gồm cả 1 cho độ chính xác).
Ví dụ 2 - 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
câu lệnh để chuyển đổi rõ ràng giữa smalldatetime và datetimeoffset .
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CAST(@thesmalldatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';
Kết quả:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset(7) | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 | +---------------------+------------------------------------+
Ví dụ 3 - 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 @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CONVERT(datetimeoffset(7), @thesmalldatetime) AS 'datetimeoffset(7)';
Kết quả:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset(7) | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 | +---------------------+------------------------------------+
Ví dụ 4 - Thay đổi Chênh lệch múi giờ
Thực tế là bạn đang chuyển đổi smalldatetime của mình giá trị của datetimeoffset có nghĩa là bạn có thể đang làm điều đó để bù lệch múi giờ. Và có khả năng bạn muốn nó được đặt thành một độ lệch khác với +00:00 (độ lệch mặc định).
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 smalldatetime 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 @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00'); SELECT @thesmalldatetime AS 'smalldatetime', @thedatetimeoffset AS 'datetimeoffset';
Kết quả:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 | +---------------------+------------------------------------+
Và đây là một ví dụ sử dụng hàm trong SELECT
tuyên bố:
DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'smalldatetime', TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';
Kết quả:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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à smalldatetime đối số, không có giây phân số.
Hệ thống của tôi trả về các số không ở cuối cùng với datetimeoffset phần phân số, tuy nhiên, bạn có thể thấy một cái gì đó như thế này:
+---------------------+----------------------------+ | smalldatetime | datetimeoffset | |---------------------+----------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 | +---------------------+----------------------------+
Dù bằng cách nào, bạn vẫn có thể tận dụng tối đa datetimeoffset độ chính xác của loại dữ liệu nếu bạn cần sửa đổi giá trị sau này.
Đây là một ví dụ sử dụng DATEADD()
để thay đổi số giây phân số sau khi quá trình chuyển đổi đã được thực hiện xong.
DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00'); SELECT @thesmalldatetime AS 'smalldatetime', @thedatetimeoffset AS 'datetimeoffset', DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';
Kết quả (sử dụng đầu ra dọc):
smalldatetime | 2025-05-21 10:16:00 datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00 Modified | 2025-05-21 10:16:00.1234567 +07:00