Bài viết này chứa các ví dụ về chuyển đổi thời gian giá trị thành smalldatetime giá trị trong SQL Server.
Khi bạn chuyển đổi thời gian giá trị thành smalldatetime , ngày được đặt thành ‘1900-01-01’ và các giá trị giờ và phút được làm tròn. Giây và giây phân số được đặt thành 0.
Ví dụ 1 - 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 từ thời gian đến smalldatetime .
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Kết quả:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Vì vậy, một phần ngày được thêm vào và đặt thành ‘1900-01-01’ và trong trường hợp này, các giá trị phút được làm tròn và giây được đặt thành 0.
Tài liệu của Microsoft nói rằng giây phân số cũng được đặt thành 0, nhưng smalldatetime kiểu dữ liệu không bao gồm giây phân số.
Nhân tiện, bất cứ khi nào bạn sử dụng smalldatetime kiểu dữ liệu, thành phần giây luôn được đặt thành 0.
Ví dụ 2 - Làm tròn giờ
Dưới đây là một ví dụ về giờ được làm tròn:
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Kết quả:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
Trong trường hợp này, tôi cũng chỉ định thang điểm 0 cho giá trị thời gian, tuy nhiên, điều này không ảnh hưởng đến kết quả.
Chỉ cần rõ ràng, thang đo là số chữ số ở bên phải dấu thập phân của một số. Độ chính xác là tổng số chữ số trong số. Khi chúng tôi chỉ định thang điểm bằng 0, điều đó có nghĩa là phần phân số không được bao gồm.
Ví dụ 3 - Chuyển đổi rõ ràng bằng CONVERT ()
Đây là một ví dụ sử dụng CONVERT()
hàm thay vì CAST()
.
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
Kết quả:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Ví dụ 4 - Chuyển đổi ngầm định
Dưới đây là một ví dụ về việc thực hiện điều tương tự, nhưng sử dụng chuyển đổi kiểu ngầm định.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Kết quả:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Vì vậy, chúng tôi nhận được cùng một kết quả, bất kể đó là chuyển đổi rõ ràng hay ẩn.
Đây là một chuyển đổi ngầm định vì chúng tôi không sử dụng một hàm chuyển đổi để chuyển đổi một cách rõ ràng. Chúng tôi chỉ đơn giản là chỉ định giá trị từ một biến của một kiểu dữ liệu cho một biến của một kiểu dữ liệu khác. 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 ấn định thời gian giá trị thành smalldatetime biến.
Ví dụ 5 - Thay đổi ngày
Nếu bạn cần thay đổi ngày (nhưng giữ nguyên thời gian), bạn có thể sử dụng DATEADD()
hàm số.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Kết quả:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
Trong trường hợp này, tôi thêm 85 vào giá trị năm, đưa nó đến năm 1985.
Tuy nhiên, hãy lưu ý rằng smalldatetime hỗ trợ phạm vi ngày rất hẹp (1900-01-01 đến 2079-06-06), vì vậy việc thêm quá nhiều vào năm có thể dẫn đến lỗi tràn như lỗi bên dưới:
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Kết quả:
Adding a value to a 'smalldatetime' column caused an overflow.