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

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

Có thể có rất ít trường hợp sử dụng khiến bạn chuyển đổi datetime2 giá trị thành datetime trong SQL Server. Đặc biệt, datetime2 loại dữ liệu có thể được đặt để sử dụng cùng kích thước bộ nhớ với datetime , nhưng với độ chính xác cao hơn. Vì vậy, trong hầu hết các trường hợp, bạn nên sử dụng datetime2 so với ngày giờ . Microsoft cũng khuyến nghị sử dụng datetime2 thay vì ngày giờ .

Tuy nhiên, trong trường hợp bạn rơi vào tình huống cần thực hiện chuyển đổi này, bài viết này chứa một số ví dụ và cân nhắc có thể hỗ trợ.

Khi bạn chuyển đổi datetime2 giá trị thành datetime , giá trị kết quả sẽ phụ thuộc vào số giây phân số được chỉ định cho datetime2 giá trị, cũng như độ chính xác của nó.

datetime2 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. Nếu bạn không chỉ định điều này, nó sẽ sử dụng 7 (mặc định).

Ngày giờ mặt khác, 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.

Do đó, nếu datetime2 sử dụng thang điểm 3, giá trị kết quả sẽ rất gần (nếu không trùng) với giá trị ban đầu. Tuy nhiên, do độ chính xác của datetime thấp hơn , các kết quả có thể khác nhau, do việc làm tròn mà nó thực hiện.

Ví dụ 1 - Chuyển đổi ngầm định

Dưới đây là ví dụ về chuyển đổi ngầm định giữa datetime2 ngày giờ .

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Kết quả:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

Đâ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 gán datetime2 giá trị thành ngày giờ biến.

Chúng ta có thể thấy rằng ngày giờ biến có độ chính xác giây phân số thấp hơn và chúng tôi kết thúc bằng một phần phân số của 123 mặc dù phần phân số ban đầu là 1234567 .

Trong trường hợp này, không làm tròn số nào được thực hiện.

Ví dụ 2 - Độ chính xác / Độ chính xác và 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.

Điều này cũng áp dụng khi chuyển đổi từ một loại dữ liệu khác (chẳng hạn như những gì chúng tôi đang làm ở đây).

Đây là một ví dụ chứng minh ý tôi muốn nói.

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Kết quả:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 |
+-----------------------------+-------------------------+

Trong ví dụ này, tôi đặt giây phân số của datetime2 giá trị thành 1256789 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).

Điều quan trọng cần lưu ý là điều này sẽ vẫn đúng, ngay cả khi chúng tôi chỉ gán 3 giây phân số cho datetime2 giá trị.

Ví dụ:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.125';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Kết quả:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Bạn cũng cần lưu ý về bất kỳ sự làm tròn nào có thể xảy ra với datetime2 ban đầu giá trị. datetime2 bản thân giá trị có thể được làm tròn nếu chúng ta cố gắng gán một giá trị có nhiều phân số giây hơn tỷ lệ của chính nó.

Ví dụ:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Kết quả:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Trong trường hợp này, tôi cố gắng gán giá trị với một phần phân số của 1256789 . Tuy nhiên, vì datetime2 (3) value chỉ có thang điểm là 3, nó chỉ có thể hỗ trợ 3 chữ số thập phân và trong trường hợp này, chữ số cuối cùng được làm tròn lên (vì chữ số sau là 5 trở lên).

Cả datetime2 (3) ngày giờ sử dụng cùng một lượng không gian lưu trữ (8 byte). datetime2 (3) kiểu dữ liệu thực sự sử dụng 7 byte để lưu trữ dữ liệu, nhưng thêm 1 byte để lưu trữ độ chính xác.

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 datetime2 ngày giờ .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetime) AS 'datetime';

Kết quả:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

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 @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetime, @thedatetime2) AS 'datetime';

Kết quả:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bạn sẽ triển khai các trình tự trong Microsoft SQL Server như thế nào?

  2. Cách lưu trữ bản ghi lịch sử trong bảng lịch sử trong SQL Server

  3. Dấu thời gian Chèn và Cập nhật hàng trong SQL Server 2008

  4. Cái nhìn đầu tiên về Công cụ ước tính bản số của máy chủ SQL mới

  5. Cách liệt kê các tệp bên trong một thư mục với SQL Server