Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chuyển đổi ‘time’ thành ‘smalldatetime’ trong SQL Server (Ví dụ T-SQL)

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.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cuộc gọi MS Access thủ tục SQL Server được lưu trữ

  2. Sự khác biệt giữa Scope_Identity (), Identity (), @@ Identity và Ident_Current () là gì?

  3. Cách lấy tất cả các bảng có ràng buộc khóa chính được tạo trong cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL 57

  4. Cách tìm tất cả các bảng có Cột nhận dạng trong Cơ sở dữ liệu SQL Server - Hướng dẫn SQL Server / T-SQL Phần 45

  5. SQL Server Thay đổi Vị trí Tệp TempDB