Bài viết này chứa các ví dụ về chuyển đổi ngày giá trị thành smalldatetime giá trị trong SQL Server.
Khi bạn chuyển đổi ngày giá trị thành smalldatetime , thông tin bổ sung được thêm vào giá trị. Điều này là do smalldatetime kiểu dữ liệu chứa cả thông tin ngày và giờ. Ngày mặt khác, kiểu dữ liệu chỉ chứa thông tin ngày tháng.
Tuy nhiên, có những trường hợp ngày đến smalldatetime chuyển đổi có thể không thành công. Đặc biệt, nếu ngày giá trị nằm ngoài phạm vi được hỗ trợ bởi smalldatetime sau đó nó sẽ không thành công với một lỗi.
Trong mọi trường hợp, dưới đây là các ví dụ về chuyển đổi giữa hai loại dữ liệu này.
Ví dụ 1 - Chuyển đổi ngầm định
Dưới đây là ví dụ về chuyển đổi ngầm định giữa ngày và smalldatetime .
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Kết quả:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00: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 ngày giá trị thành smalldatetime biến.
Chúng ta có thể thấy rằng ngày biến chỉ chứa thông tin ngày tháng, trong khi đó, smalldatetime biến chứa cả thông tin ngày và giờ.
Khi bạn chuyển đổi giữa ngày và smalldatetime , thành phần thời gian được đặt thành 00:00:00
. Điều này cung cấp độ chính xác đến từng phút.
Lý do tất cả đều là số 0 là vì giá trị ngày không chứa bất kỳ thông tin thời gian nào, do đó, SQL Server không có cách nào để biết bạn muốn mấy giờ (nếu có).
Tất nhiên, bạn cũng nhận được kết quả này ngay cả khi bạn chỉ định giá trị chỉ ngày cho smalldatetime mà không thực hiện chuyển đổi:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01' SELECT @thesmalldatetime AS 'smalldatetime';
Kết quả:
+---------------------+ | smalldatetime | |---------------------| | 2020-12-01 00:00:00 | +---------------------+
Ví dụ 2 - Sửa đổi thời gian
Nếu bạn cần chỉ định thời gian (nhưng giữ nguyên ngày), bạn có thể sử dụng DATEADD()
chức năng để làm điều đó.
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime) SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Kết quả:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
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 ngày và smalldatetime .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Kết quả:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
Kết quả tương tự như chuyển đổi ngầm định.
Chúng tôi cũng có thể điều chỉnh thời gian như sau:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Kết quả:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07: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 @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Kết quả:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
Và điều chỉnh thời gian:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Kết quả:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Ví dụ 5 - Lỗi Ngoài Phạm vi
Như đã đề cập, nếu ngày nằm ngoài phạm vi được hỗ trợ bởi smalldatetime loại dữ liệu, bạn sẽ gặp lỗi.
DECLARE @thedate date SET @thedate = '2080-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Kết quả:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
smalldatetime loại dữ liệu chỉ hỗ trợ phạm vi ngày từ 1900-01-01 đến 2079-06-06.
Ngoài ra, smalldatetime loại dữ liệu chỉ hỗ trợ phạm vi thời gian từ 00:00:00 đến 23:59:59, vì vậy bạn cũng sẽ gặp lỗi nếu cố sử dụng giá trị bên ngoài phạm vi đó (ví dụ:với độ chính xác cao hơn).
Ví dụ:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Kết quả:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
Tuy nhiên, trong trường hợp này, đó không phải là lỗi khi chuyển đổi, mà thực sự là lỗi khi sử dụng DATEADD()
hàm (vì hàm không cho phép sử dụng thời gian cụ thể đó vào smalldatetime kiểu dữ liệu).