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

Chuyển đổi ‘datetimeoffset’ 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 bộ datetimeoffs giá trị thành datetime2 trong SQL Server.

Khi bạn chuyển đổi bộ datetimeoffs giá trị thành datetime2 , ngày và giờ được sao chép vào datetime2 giá trị và múi giờ bị cắt bớt. Các giây phân số cũng được cắt bớt để vừa với nếu độ chính xác của đích thấp hơn.

datetimeoffset 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 bằng cách sử dụng datetimeoffset(n) cú pháp. Nếu bạn không chỉ định điều này, nó sẽ sử dụng 7 (mặc định). Nó cũng có độ lệch múi giờ. Kích thước lưu trữ của loại dữ liệu này là 8, 9 hoặc 10 byte, tùy thuộc vào độ chính xác đang được sử dụng.

datetime2 kiểu dữ liệu cũng cho phép bạn chỉ định độ chính xác giây phân số từ 0 đến 7 (sử dụng datetime2(n) cú pháp). Nó không có nhận biết múi giờ. Kích thước lưu trữ của nó là 6, 7 hoặc 8, tùy thuộc vào độ chính xác được sử dụng.

Lưu ý rằng dung lượng lưu trữ được liệt kê ở đây là dung lượng được liệt kê trong tài liệu của Microsoft. Tuy nhiên, các kiểu dữ liệu này cũng sử dụng 1 byte để lưu trữ độ chính xác. Do đó, hãy thêm 1 byte vào số tiền được liệt kê ở đây để có bức tranh đầy đủ hơn về các yêu cầu lưu trữ.

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

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedatetime2 datetime2;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Kết quả:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |
+------------------------------------+-----------------------------+

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

Trong ví dụ này, cả hai kiểu dữ liệu đều sử dụng độ chính xác mặc định (7 chữ số thập phân). Do đó, phần phân số là 1234567 cho cả hai kết quả.

Chúng tôi cũng thấy rằng chênh lệch múi giờ đã bị cắt ngắn - datetime2 kiểu dữ liệu không có nhận biết múi giờ.

Trong chuyển đổi này, kích thước bộ nhớ đã giảm từ 10 byte (đối với datetimeoffset ) thành 8 byte (cho datetime2 ), mặc dù lưu ý rằng 1 byte được thêm vào để lưu trữ độ chính xác.

Ví dụ 2 - Độ chính xác khác nhau

Dưới đây là một ví dụ minh họa điều gì sẽ xảy ra nếu datetime2 giá trị sử dụng độ chính xác thấp hơn cho bộ ngày giờ giá trị.

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Kết quả:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |
+------------------------------------+-------------------------+

Trong ví dụ này, datetimeoffset có thang điểm 7 nhưng datetime2 giá trị có thang điểm chỉ 3 . Do đó, các giây phân số đã được cắt bớt để vừa.

Lưu ý rằng điều này có thể gây ra làm tròn số. Dưới đây là một ví dụ trong đó phần phân đoạn của datetime2 giá trị được làm tròn đến 124 .

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Kết quả:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |
+------------------------------------+-------------------------+

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 datetimeoffset datetime2 .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS datetime2) AS 'datetime2';

Kết quả:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |
+------------------------------------+-----------------------------+

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 @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(datetime2, @thedatetimeoffset) AS 'datetime2';

Kết quả:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |
+------------------------------------+-----------------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để kết nối với SQL Server qua sqlalchemy bằng Windows Authentication?

  2. Cách tạo một thủ tục được lưu trữ trong SQL Server

  3. Lấy dữ liệu với bộ ký tự UTF-8 từ máy chủ MSSQL bằng phần mở rộng PHP FreeTDS

  4. Cách thêm Ràng buộc DEFAULT vào một cột hiện có trong SQL Server

  5. Làm cách nào để viết CẬP NHẬT SQL với bí danh Bảng trong SQL Server 2008?