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

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

Nếu bạn có datetimeoffset nhưng bạn không cần phần bù ngày và múi giờ, chuyển đổi nó thành thời gian sẽ giúp bạn tiết kiệm rất nhiều không gian lưu trữ (đồng thời loại bỏ các chi tiết không cần thiết khỏi giá trị). Bài viết này chứa các ví dụ về chuyển đổi bộ datetimeoffs giá trị thành thời gian giá trị trong SQL Server.

datetimeoffset kiểu dữ liệu bao gồm ngày và giờ với độ lệch múi giờ. Nó cũng có một phần giây phân số từ 0 đến 7 (điều này phụ thuộc vào số giây phân số được gán cho nó). Đ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). 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. Độ chính xác của nó là 100 nano giây.

thời gian mặt khác, kiểu dữ liệu chỉ bao gồm thời gian. Nó không bao gồm ngày và không bao gồm chênh lệch múi giờ. Tuy nhiên, tương tự như datetimeoffset nó cũng cho phép bạn chỉ định một phần giây phân số từ 0 đến 7 (bằng cách sử dụng time(n) cú pháp). Nó sử dụng 3, 4 hoặc 5 byte, tùy thuộc vào độ chính xác của nó.

Khi bạn chuyển đổi bộ datetimeoffs giá trị thành thời gian kiểu dữ liệu, bạn sẽ mất phần ngày tháng. Bạn cũng mất khoảng thời gian bù đắp. Tuy nhiên, bạn cũng giảm kích thước lưu trữ từ 8 đến 10 byte xuống 3, 4 hoặc 5 byte. Tuy nhiên, bạn sẽ chỉ thực hiện chuyển đổi này nếu bạn không cần phần ngày hoặc chênh lệch múi giờ.

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 đó, bạn sẽ cần thêm 1 byte vào số tiền được liệt kê ở đây.

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 thời gian .

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thetime time;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Kết quả:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

Đâ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 thời gian biến.

Ở đây chúng ta có thể thấy rằng thời gian giá trị chỉ bao gồm thời gian (không có thành phần ngày tháng). Thành phần bù ngày và múi giờ đã bị xóa khỏi giá trị.

Trong ví dụ này, cả hai kiểu dữ liệu đều sử dụng độ chính xác mặc định (dẫn đến 7 chữ số thập phân). Điều này dẫn đến datetimeoffset giá trị sử dụng 10 byte và thời gian giá trị sử dụng 5 byte.

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

Kết quả chính xác sẽ phụ thuộc vào cài đặt độ chính xác cho từng loại dữ liệu. Trong ví dụ tiếp theo, thời gian giá trị sử dụng độ chính xác thấp hơn cho bộ datetimeoffs ban đầu giá trị:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Kết quả:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 |
+------------------------------------+------------------+

Hệ thống của tôi hiển thị các số không ở cuối, nhưng vấn đề là thời gian giá trị hiện có độ chính xác chỉ 3 chữ số thập phân so với 7 chữ số thập phân mà giá trị ban đầu sử dụng.

Giảm độ chính xác cũng có thể dẫn đến thời gian giá trị được làm tròn. Đây là một ví dụ:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Kết quả:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 |
+------------------------------------+------------------+

Trong trường hợp này, chúng ta kết thúc bằng một phần phân số của 124 thay vì 123 , bởi vì chữ số sau là 5 hoặc lớn hơn.

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 thời gian .

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

Kết quả:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 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 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(time, @thedatetimeoffset) AS 'time'; 

Kết quả:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 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. Giải pháp cho:Cập nhật cửa hàng, chèn hoặc xóa câu lệnh ảnh hưởng đến một số hàng không mong muốn (0)

  2. Truyền trực tuyến hình ảnh dựa trên dữ liệu bằng HttpHandler

  3. Truy vấn PIVOT trên các bản ghi riêng biệt

  4. Dấu ngoặc nhọn trong T-SQL

  5. Sử dụng điều kiện if trong SQL Server chèn