Nếu bạn có datetimeoffset nhưng bạn không cần phần bù múi giờ và múi giờ, chuyển đổi nó thành ngày sẽ giúp bạn tiết kiệm rất nhiều không gian lưu trữ (đồng thời loại bỏ các chi tiết không cần thiết khỏi giá trị). Bài viết này chứa các ví dụ về chuyển đổi bộ datetimeoffs giá trị của một ngày tháng giá trị trong SQL Server.
datetimeoffset kiểu dữ liệu bao gồm ngày và giờ với độ lệch múi giờ. Nó cũng có một phần giây phân số từ 0 đến 7 (điều này phụ thuộc vào số giây phân số được gán cho nó). Điều này được thực hiện bằng cách sử dụng datetimeoffset(n)
cú pháp. Nếu bạn không chỉ định điều này, nó sẽ sử dụng 7 (mặc định). Kích thước lưu trữ của loại dữ liệu này là 8, 9 hoặc 10 byte (cộng thêm 1 byte để lưu trữ độ chính xác), tùy thuộc vào độ chính xác đang được sử dụng. Độ chính xác của nó là 100 nano giây.
Ngày mặt khác, kiểu dữ liệu chỉ bao gồm ngày tháng. Nó không bao gồm thời gian và có độ chính xác là 1 ngày. Nó sử dụng 3 byte để lưu trữ.
Khi bạn chuyển đổi bộ datetimeoffs giá trị của một ngày tháng kiểu dữ liệu, bạn sẽ mất phần thời gian (bao gồm cả độ lệch múi giờ). Tuy nhiên, bạn cũng giảm dung lượng lưu trữ xuống 3 byte cố định. Tất nhiên, bạn sẽ chỉ thực hiện chuyển đổi này nếu bạn không cần chênh lệch múi giờ và múi giờ.
Ví dụ 1 - Chuyển đổi ngầm định
Dưới đây là một ví dụ về chuyển đổi ngầm giữa datetimeoffset và ngày .
DECLARE @thedatetimeoffset datetimeoffset, @thedate date; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thedate = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedate AS 'date';
Kết quả:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+
Đâ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 datetimeoffset giá trị của một ngày tháng biến.
Ở đây, chúng ta có thể thấy rằng ngày giá trị chỉ bao gồm ngày (không có thành phần thời gian). Thành phần thời gian, bao gồm cả độ lệch múi giờ của nó, đã bị xóa khỏi giá trị.
Trong ví dụ này, datetimeoffset giá trị sử dụng độ chính xác mặc định (dẫn đến 7 chữ số thập phân). Điều này dẫn đến kiểu dữ liệu sử dụng 10 byte (thực tế là 11 byte nếu bạn đếm thêm byte lưu trữ độ chính xác). Ngày giá trị chỉ sử dụng 3 byte.
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
tuyên bố để chuyển đổi rõ ràng giữa datetimeoffset và ngày .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS date) AS 'date';
Kết quả:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+
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 @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(date, @thedatetimeoffset) AS 'date';
Kết quả:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+