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

Chuyển đổi ‘datetimeoffset’ thành ‘datetime’ 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 datetime trong SQL Server.

Khi bạn chuyển đổi bộ datetimeoffs giá trị thành datetime , các giá trị ngày và giờ được sao chép, và độ lệch múi giờ bị cắt bớt. Khi độ chính xác phân số của bộ ngày giờ giá trị lớn hơn ba chữ số, giá trị bị cắt bớt.

datetimeoffset kiểu dữ liệu cho phép bạn chỉ định độ chính xác từng phần giây từ 0 đến 7. Điều này được thực hiện 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. Một byte khác được sử dụng để lưu trữ độ chính xác để điều này thêm 1 byte vào các số liệu đó.

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 các gia số .000, .003 hoặc .007 giây. Loại dữ liệu này không có nhận biết múi giờ và do đó, không có chênh lệch múi giờ. Kích thước bộ nhớ của nó là 8 byte.

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

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

Kết quả:

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

Đâ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 gán datetimeoffset 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 có làm tròn nào được thực hiện.

Chúng tôi cũng thấy rằng chênh lệch múi giờ đã bị cắt bớt. Ngày giờ 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 (11 byte nếu bạn bao gồm thêm byte lưu trữ độ chính xác) cho datetimeoffset , thành 8 byte cho datetime . Tuy nhiên, nếu datetimeoffset giá trị đã sử dụng thang điểm từ 0 đến 2, nó sẽ chỉ sử dụng 8 byte (9 bao gồm cả độ chính xác).

Nếu nó đã sử dụng thang điểm 3 (tương đương với datetime giá trị), kích thước lưu trữ sẽ là 9 byte (10 với độ chính xác). Tuy nhiên, độ chính xác của nó sẽ cao hơn datetime . Tất nhiên, độ chính xác sẽ giảm ngay sau khi chúng tôi chuyển đổi nó thành datetime .

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 
  @thedatetimeoffset datetimeoffset, 
  @thedatetime datetime;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1250000 +07:00';
SET @thedatetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime AS 'datetime';

Kết quả:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime                |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |
+------------------------------------+-------------------------+

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

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

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

Kết quả:

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

Kết quả:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime                |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 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. Cách thêm mã hóa xml <? Xml version =1.0 encoding =UTF-8?> Vào Đầu ra xml trong SQL Server

  2. Truy vấn con của SQL Server trả về nhiều hơn 1 giá trị. Điều này không được phép khi truy vấn con theo sau =,! =, <, <=,>,> =

  3. SQL động để tạo tên cột?

  4. Có cách nào để truy cập giá trị hàng trước đó trong câu lệnh SELECT không?

  5. Truy vấn được tham số hóa ..... yêu cầu tham số '@units', không được cung cấp