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

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

Bài viết này chứa các ví dụ về chuyển đổi ngày giờ giá trị thành datetime2 giá trị trong SQL Server.

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

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

datetime2 Mặt khác, 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).

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

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

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

Kết quả:

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

Đây là một chuyển đổi ngầm định vì chúng tôi không sử dụng một chức năng chuyển đổi (như những chức năng 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 datetime giá trị thành datetime2 biến.

Chúng ta có thể thấy rằng datetime2 biến có độ chính xác giây phân số nhiều hơn và chúng tôi kết thúc bằng một phần phân số của 1233333 (so với 123 cho ngày giờ giá trị).

Ví dụ 2 - 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. Như bạn có thể mong đợi, điều này có thể gây ra nhiều nhầm lẫn nếu bạn không biết cách hoạt động của nó. Nó không chỉ có thể gây nhầm lẫn khi sử dụng datetime tự nó, nó có thể gây thêm nhầm lẫn khi chuyển đổi giá trị đó sang một kiểu dữ liệu khác.

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

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

Kết quả:

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

Trong ví dụ này, tôi đặt giây phân số thành 125 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).

datetime2 tuy nhiên, hãy đặt giây phân số thành 1266667 .

Nhân tiện, nếu chúng tôi chỉ đặt giá trị ban đầu thành datetime2 ngay từ đầu, phần phân số của nó sẽ trả về 1250000 .

Ví dụ 3 - Độ chính xác / Độ chính xác

Một trong những lợi ích của datetime2 là nó cho phép bạn chỉ định độ chính xác của phân số giây. Nếu bạn không làm điều này, nó sử dụng 7 (do đó, ví dụ trước sử dụng 7).

Do đó, chúng tôi có thể sửa đổi ví dụ trước đó để datetime2 giá trị sử dụng cùng độ chính xác giây phân số như ngày giờ kiểu dữ liệu.

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

Kết quả:

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

Khi chúng tôi làm điều này, datetime2 giá trị trả về kết quả giống như ngày giờ giá trị. Nó cũng sử dụng cùng một lượng dung lượng lưu trữ (8 byte). Trong trường hợp này, datetime2 sử dụng 7 byte để lưu trữ giá trị và 1 byte để lưu trữ độ chính xác của giá trị.

Bạn thậm chí có thể chỉ định ít hơn độ chính xác phân số giây so với ngày giờ nếu bạn không cần thêm độ chính xác. Làm điều này sẽ giúp bạn tiết kiệm cả byte không gian lưu trữ ( datetime2 của bạn giá trị sẽ sử dụng 7 byte, so với 8 byte cho datetime giá trị).

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

Kết quả:

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

Hãy nhớ rằng điều này cũng có thể dẫn đến việc làm tròn số giây của phân số.

Ví dụ 4 - 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 datetime datetime2 .

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

Kết quả:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Ví dụ 5 - 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 @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(datetime2(3), thedatetime) AS 'datetime2(3)';

Kết quả:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Khuyến nghị của Microsoft

Microsoft khuyến nghị sử dụng truyền rõ ràng bất cứ khi nào tồn tại kịch bản so sánh hỗn hợp giữa hai loại dữ liệu này:

Dưới mức độ tương thích cơ sở dữ liệu 130, các chuyển đổi ngầm định từ datetime đến datetime2 các loại dữ liệu cho thấy độ chính xác được cải thiện bằng cách tính theo phần mili giây, dẫn đến các giá trị được chuyển đổi khác nhau… Sử dụng tính năng truyền rõ ràng thành datetime2 loại dữ liệu bất cứ khi nào có kịch bản so sánh hỗn hợp giữa datetime datetime2 các kiểu dữ liệu tồn tại.


  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 có đang đo hiệu suất máy chủ SQL bằng các số liệu này không?

  2. T-SQL Cast so với Convert

  3. Làm cách nào để thay đổi giản đồ db thành dbo

  4. SSMS hiện đi kèm với Azure Data Studio

  5. Cách gửi kết quả truy vấn qua email trong SQL Server (T-SQL)