Bài viết này chứa các ví dụ về chuyển đổi ngày giờ giá trị thành thời gian giá trị trong SQL Server.
Một trong những lợi ích của việc chuyển đổi ngày giờ giá trị thành thời gian là bạn giảm kích thước bộ nhớ từ 8 byte xuống 3, 4 hoặc 5 byte (tùy thuộc vào độ chính xác mà bạn sử dụng cho thời gian giá trị). Nói một cách chính xác, thời gian sử dụng 4, 5 hoặc 6 byte, vì một byte phụ được sử dụng để lưu trữ độ chính xác của nó.
Khi bạn chuyển đổi ngày giờ giá trị thành thời gian , chỉ phần thời gian của giá trị được sao chép. Kết quả chính xác sẽ phụ thuộc vào độ chính xác của phân số giây mà bạn chỉ định cho thời gian . Khi thời gian độ chính xác nhỏ hơn ngày giờ độ chính xác, giây phân số được làm tròn để phù hợp với thời gian độ chính xác.
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.
thời gian 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. Điều này đạt được bằng cách sử dụng time ( n ) cú pháp, trong đó n là thang đo từ 0 đến 7. Nếu bạn không chỉ định điều này, nó sẽ sử dụng 7, cung cấp độ chính xác 100 nano giây.
Ví dụ 1 - Chuyển đổi ngầm định
Dưới đây là một ví dụ về chuyển đổi ngầm định giữa ngày giờ và thời gian .
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Kết quả:
+-------------------------+------------------+ | datetime | time | |-------------------------+------------------| | 2025-05-21 10:15:30.123 | 10:15:30.1233333 | +-------------------------+------------------+
Đâ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 thời gian biến.
Điều rõ ràng nhất về kết quả này là thời gian giá trị không bao gồm ngày. Điều này được mong đợi, vì thời gian kiểu dữ liệu chỉ để lưu trữ các giá trị thời gian, không phải giá trị ngày tháng.
Chúng ta cũng có thể thấy rằng thời gian 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ị). Điều này xảy ra vì thời gian giá trị đang sử dụng thang đo mặc định là 7 (vì chúng tôi không chỉ định rõ ràng thang đo).
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.
Đây là một ví dụ:
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'thetime';
Kết quả:
+-------------------------+------------------+ | datetime | thetime | |-------------------------+------------------| | 2025-05-21 10:15:30.127 | 10:15:30.1266667 | +-------------------------+------------------+
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ì nó chỉ có thể được làm tròn đến gia số .000, .003 hoặc .007 giây).
thời gian tuy nhiên, hãy đặt giây phân số thành 1266667 .
Nếu chúng tôi chỉ đặt giá trị ban đầu thành thời gian ngay từ đầu, phần phân số của nó sẽ trả về 1250000 .
Ví dụ 3 - Độ chính xác / Độ chính xác
Như đã đề cập, thời gian kiểu dữ liệu cho phép bạn chỉ định độ chính xác của phân số giây. Nếu bạn không làm điều này, nó sử dụng 7 (do đó, ví dụ trước sử dụng 7).
Bạn có thể sửa đổi điều này bằng cách sử dụng time ( n ) cú pháp. Do đó, tôi có thể đã sử dụng thời gian (7) cho các ví dụ trước để có được kết quả tương tự.
Trong ví dụ này, tôi xóa hoàn toàn số giây phân số bằng cách sử dụng thời gian (0) :
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Kết quả:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+----------+
Khi chúng tôi thực hiện việc này, kích thước bộ nhớ của thời gian giá trị giảm xuống 3 byte (4 byte bao gồm độ chính xác) thay vì 8 byte cho datetime giá trị.
Lưu ý rằng việc sử dụng độ chính xác thấp hơn giá trị ban đầu sẽ làm cho kết quả được làm tròn để phù hợp với độ chính xác đã chỉ định.
Ví dụ:
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.525'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Kết quả:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.527 | 10:15:31 | +-------------------------+----------+
Ví dụ 4 - 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 và thời gian .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS time(0)) AS 'time(0)';
Kết quả:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+
Ví dụ 5 - 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(time(0), @thedatetime) AS 'time(0)';
Kết quả:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+