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

Chuyển đổi một ngày thành một múi giờ khác trong SQL Server

AT TIME ZONE đã được giới thiệu trong SQL Server 2016 để chuyển đổi một ngày thành datetimeoffset giá trị trong múi giờ mục tiêu.

Hàm này tương tự như một số hàm T-SQL khác, chẳng hạn như SWITCHOFFSET()TODATETIMEOFFSET() tuy nhiên, AT TIME ZONE mệnh đề cho phép / (yêu cầu) bạn chỉ định độ lệch múi giờ theo tên, thay vì giá trị chênh lệch thực tế.

Bài viết này khám phá cách thức AT TIME ZONE hoạt động và giải thích lợi ích của nó khi so sánh với các chức năng khác được đề cập.

Ví dụ về cách sử dụng

Đây là một ví dụ cơ bản về cách AT TIME ZONE mệnh đề hoạt động.

DECLARE @dto datetimeoffset = '2020-04-01 00:00:00.0000000 +00:00';
SELECT
  @dto AS [Original],
  @dto AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time];

Kết quả (sử dụng đầu ra dọc):

Original | 2020-04-01 00:00:00.0000000 +00:00
NZ Time  | 2020-04-01 13:00:00.0000000 +13:00

Bạn có thể tự hỏi tại sao Microsoft thậm chí còn giới thiệu tính năng này khi bạn có thể đã sử dụng SWITCHOFFSET() chức năng để làm điều tương tự?

Chà, bạn không thể thực sự làm điều tương tự với SWITCHOFFSET() .

Với SWITCHOFFSET() , bạn phải cung cấp độ lệch múi giờ thực ở định dạng [+ | -] TZH:TZM hoặc dưới dạng số nguyên có dấu (trong phút). Điều này có nghĩa là bạn cần biết chênh lệch múi giờ chính xác, múi giờ đó hiện có đang quan sát tiết kiệm ánh sáng ban ngày hay không.

Với AT TIME ZONE , bạn không cần biết điều đó. Tất cả những gì bạn cần biết là tên của múi giờ (và đây là cách lấy tên của múi giờ).

Ví dụ về tiết kiệm ánh sáng ban ngày

Dưới đây là một ví dụ chứng minh lợi ích của việc sử dụng AT TIME ZONE liên quan đến tiết kiệm ánh sáng ban ngày.

DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
  @dto1 AS [@dto1],
  @dto2 AS [@dto2],
  @dto1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto1],
  @dto2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto2];

Kết quả (sử dụng đầu ra dọc):

@dto1          | 2020-04-01 00:00:00.0000000 +00:00
@dto2          | 2020-04-07 00:00:00.0000000 +00:00
NZ Time: @dto1 | 2020-04-01 13:00:00.0000000 +13:00
NZ Time: @dto2 | 2020-04-07 12:00:00.0000000 +12:00

Ở New Zealand, tiết kiệm ánh sáng ban ngày kết thúc vào ngày 5 tháng 3 năm 2020. Do đó, trong ví dụ này, tôi sử dụng hai ngày (ngày 1 tháng 3 và ngày 7 tháng 3).

Khi tôi chuyển đổi chúng thành 'Giờ chuẩn New Zealand', AT TIME ZONE tự động bao gồm tiết kiệm ánh sáng ban ngày trong tính toán của nó và trả về ngày / giờ áp dụng.

Vì vậy, chúng ta có thể thấy rằng ngày 1 tháng 3 sử dụng độ lệch múi giờ là +13:00 và ngày 7 tháng 3 sử dụng +12:00 (vì tiết kiệm ánh sáng ban ngày đã kết thúc vào ngày 5 tháng 3).

Nếu tôi đã sử dụng SWITCHOFFSET() Tôi sẽ phải biết sử dụng độ lệch múi giờ nào cho mỗi ngày.

DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
  @dto1 AS [@dto1],
  @dto2 AS [@dto2],
  SWITCHOFFSET(@dto1, '+12:00') AS [+12:00],
  SWITCHOFFSET(@dto2, '+13:00') AS [+13:00];

Kết quả (sử dụng đầu ra dọc):

@dto1  | 2020-04-01 00:00:00.0000000 +00:00
@dto2  | 2020-04-07 00:00:00.0000000 +00:00
+12:00 | 2020-04-01 12:00:00.0000000 +12:00
+13:00 | 2020-04-07 13:00:00.0000000 +13:00

Chuyển đổi từ ngày mà không có chênh lệch múi giờ

Bạn cũng có thể sử dụng AT TIME ZONE vào những ngày không có chênh lệch múi giờ. Trên thực tế, hàm chấp nhận bất kỳ biểu thức nào có thể được giải quyết thành smalldatetime , ngày giờ , datetime2 hoặc datetimeoffset giá trị.

Tuy nhiên, khi làm điều này, bạn cần lưu ý đến cách tính kết quả. Khi ngày được cung cấp mà không có thông tin về độ lệch, hàm sẽ áp dụng độ lệch của múi giờ với giả định rằng ngày nhập nằm trong múi giờ mục tiêu.

DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
  @dt1 AS [@dt1],
  @dt2 AS [@dt2],
  @dt1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
  @dt2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];

Kết quả:

@dt1          | 2020-04-01 00:00:00
@dt2          | 2020-04-07 00:00:00
NZ Time: @dt1 | 2020-04-01 00:00:00.0000000 +13:00
NZ Time: @dt2 | 2020-04-07 00:00:00.0000000 +12:00

Lưu ý rằng mặc dù đã áp dụng chênh lệch múi giờ như đã chỉ định, nhưng điều này không ảnh hưởng đến ngày / giờ. Cả ngày / giờ kết quả đều có cùng giá trị - chỉ chênh lệch múi giờ đã thay đổi.

Nếu đây không phải là những gì bạn muốn, thì bạn có thể thêm AT TIME ZONE 'UTC' kết hợp để chuyển đổi ngày ban đầu thành UTC trước khi chúng được chuyển đổi sang múi giờ mong muốn.

DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
  @dt1 AS [@dt1],
  @dt2 AS [@dt2],
  @dt1 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
  @dt2 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];

Kết quả:

@dt1          | 2020-04-01 00:00:00
@dt2          | 2020-04-07 00:00:00
NZ Time: @dt1 | 2020-04-01 13:00:00.0000000 +13:00
NZ Time: @dt2 | 2020-04-07 12:00:00.0000000 +12:00

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2016:Tác động đến hiệu suất của Luôn được mã hóa

  2. cơ sở dữ liệu đính kèm chỉ đọc

  3. Tối ưu hóa TempDB:Tránh tắc nghẽn và các vấn đề về hiệu suất

  4. Làm thế nào để tìm ranh giới của các nhóm số liên tiếp liền nhau?

  5. 3 cách trả về danh sách công việc tác nhân máy chủ SQL (T-SQL)