Bài viết này khám phá những điểm khác biệt chính giữa ngày giờ và smalldatetime kiểu dữ liệu trong SQL Server.
Cả hai kiểu dữ liệu đều được sử dụng để lưu trữ các giá trị ngày và giờ, tuy nhiên, có sự khác biệt giữa hai kiểu. Trong hầu hết các trường hợp, bạn nên tránh cả hai loại và sử dụng datetime2 thay vào đó (Microsoft cũng khuyến nghị điều này). Trong mọi trường hợp, dưới đây là so sánh của hai loại dữ liệu này.
Bảng sau đây trình bày một số điểm giống và khác nhau chính giữa hai loại dữ liệu này.
Tính năng | smalldatetime | ngày giờ |
---|---|---|
Tuân thủ SQL (ANSI &ISO 8601) | Không | Không |
Phạm vi ngày | 1900-01-01 đến 2079-06-06 | 1753-01-01 đến 9999-12-31 |
Phạm vi thời gian | 00:00:00 đến 23:59:59 | 00:00:00 đến 23:59:59.997 |
Độ dài ký tự | tối đa 19 vị trí | tối thiểu 19 vị trí tối đa 23 vị trí |
Kích thước bộ nhớ | 4 byte, cố định | 8 byte, cố định |
Độ chính xác | Một phút | Được làm tròn đến gia số .000, .003 hoặc .007 giây |
Độ chính xác phân số giây | Không | Có |
Độ chính xác phân số giây do người dùng xác định | Không | Không |
Chênh lệch múi giờ | Không có | Không có |
Nhận biết và bảo toàn độ lệch múi giờ | Không | Không |
Nhận biết tiết kiệm ánh sáng ban ngày | Không | Không |
Tôi nên sử dụng "datetime" hay "smalldatetime"?
Microsoft khuyến cáo không nên sử dụng cả hai kiểu dữ liệu này cho công việc mới. Bạn chỉ nên sử dụng chúng nếu bạn có lý do chính đáng.
Nhưng nếu bạn phải chọn, quyết định của bạn có thể được thực hiện bằng cách cân nhắc thêm độ chính xác và độ chính xác của ngày giờ so với yêu cầu lưu trữ thấp hơn của smalldatetime .
Nói cách khác, nếu bạn không cần độ chính xác đến từng giây, thì smalldatetime sẽ thực hiện công việc trong khi chỉ sử dụng một nửa không gian lưu trữ. Mặt khác, nếu bạn cần độ chính xác đến từng giây (hoặc thậm chí một số giây phân số), thì bạn sẽ cần sử dụng datetime .
Trong mọi trường hợp, Microsoft khuyên bạn nên sử dụng ngày , thời gian , datetime2 hoặc datetimeoffset cho công việc mới.
Xem smalldatetime so với datetime2 và ngày giờ so với datetime2 để xem từng loại trong số này so sánh như thế nào với datetime2 .
Ví dụ 1 - So sánh Cơ bản
Dưới đây là một ví dụ nhanh để chứng minh sự khác biệt cơ bản giữa ngày giờ và smalldatetime .
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Kết quả:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Ở đây, tôi đã đặt smalldatetime biến thành cùng một giá trị với datetime Biến đổi. Điều này khiến giá trị được chuyển đổi thành smalldatetime và sau đó chúng ta có thể sử dụng SELECT
để xem giá trị thực tế đã được gán cho mỗi biến.
Trong trường hợp này, cả hai biến đều làm tròn giá trị. Nhưng chúng được làm tròn theo cách khác nhau.
Ngày giờ biến làm tròn phần giây phân số. Điều này là do ngày giờ luôn làm tròn đến gia số .000, .003 hoặc .007 giây.
smalldatetime mặt khác, làm tròn số phút phần. Không chỉ vậy, phần giây được đặt bằng không. Điều này được mong đợi, vì tài liệu chính thức của Microsoft nói rằng smalldatetime
Thời gian của ‘s là … dựa trên một ngày 24 giờ, với giây luôn là 0 (:00) và không có giây phân số
.
Vì vậy, chúng ta có thể thấy rằng ngày giờ loại cung cấp giá trị ngày / giờ chính xác và chính xác hơn.
Ví dụ 2 - Đặt giá trị từ chữ viết chuỗi
Trong các ví dụ trước, smalldateime giá trị đã được chỉ định bằng cách đặt nó thành cùng một giá trị với ngày giờ giá trị. Khi chúng tôi làm điều đó, SQL Server thực hiện một chuyển đổi ngầm định để dữ liệu “khớp” với kiểu dữ liệu mới.
Hóa ra, chúng tôi cũng có thể đặt smalldatetime biến thành cùng một ký tự chuỗi bao gồm giây phân số (mặc dù kiểu dữ liệu này không lưu trữ giây phân số).
Đây là một ví dụ mà tôi làm điều đó:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = '2025-05-21 10:15:30.555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Kết quả:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Tất nhiên, kết quả giống nhau khi chúng tôi chọn các giá trị - smalldatetime giá trị không hiển thị bất kỳ giây phân số nào, giây bằng 0 và phút được làm tròn.
Tuy nhiên, nếu chúng tôi sử dụng nhiều hơn 3 chữ số thập phân, thì cả hai kiểu dữ liệu sẽ trả về lỗi.
Lỗi đối với ngày giờ :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Kết quả:
Msg 241, Level 16, State 1, Line 4 Conversion failed when converting date and/or time from character string.
Lỗi đối với smalldatetime :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Kết quả:
Msg 295, Level 16, State 3, Line 5 Conversion failed when converting character string to smalldatetime data type.
Ví dụ 3 - Kích thước bộ nhớ
smalldatetime kiểu dữ liệu có kích thước lưu trữ cố định là 4 byte. Đây là một trong số ít lợi ích của smalldatetime đã hơn datetime , có kích thước lưu trữ cố định là 8 byte.
Chúng tôi có thể kiểm tra kích thước bộ nhớ bằng DATALENGTH()
hàm để trả về số byte được sử dụng cho mỗi giá trị của chúng ta:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(@thedatetime) AS 'datetime', DATALENGTH(@thesmalldatetime) AS 'smalldatetime';
Kết quả
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+
Chúng tôi cũng nhận được kết quả tương tự ngay cả khi chúng tôi chuyển đổi chúng thành varbinary , tiêu biểu hơn về cách chúng thực sự được lưu trữ trong cơ sở dữ liệu:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(CAST(@thedatetime AS varbinary(10))) AS 'datetime', DATALENGTH(CAST(@thesmalldatetime AS varbinary(10))) AS 'smalldatetime';
Kết quả
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+