在 SQL 服务器中将 GMT 转换为 EST

Converting GMT to EST in SQL Server

我有一个 table 存储夏令时和非夏令时的记录

CREATE TABLE #tmp 
(
    ID int,
    IntervalName nvarchar(100),
    StartDate datetime,
    EndDate Datetime,
    offset numeric(5, 2)
)

INSERT INTO #tmp 
VALUES (1, 'EDT', '2022-03-13 07:00:00.000', '2022-11-06 06:00:00.000',-4.00)
INSERT INTO #tmp 
VALUES (2, 'EST', '2022-11-06 06:00:00.000', '2023-03-12 07:00:00.000', -5.00)

我有我的交易 tables,它在 GMT 时区有 Date 列。

   ID   DatetimeGMT                  DatetimeLocal  
   ---------------------------------------------------------
   1    2022-11-05 07:00:00.000      2022-11-05 03:00:00.000        
   2    2022-11-10 06:00:00.000      2023-11-10 01:00:00.000 

现在我的 DatetimeLocal 列正在根据 DatetimeGMT 列计算偏移小时数。

ID = 1 的行在偏移量 -4 下,ID = 2 的行在偏移量 -5 下。

有什么建议可以实现吗?

如果您将偏移量全部存储在这样的 table 中,那么您只需加入即可找到正确的偏移量。

例如

drop table if exists #tmp
drop table if exists #tran
go
CREATE TABLE #tmp 
(
    ID int,
    IntervalName nvarchar(100),
    StartDate datetime,
    EndDate Datetime,
    offset numeric(5, 2)
)

INSERT INTO #tmp 
VALUES (1, 'EDT', '2022-03-13 07:00:00.000', '2022-11-06 06:00:00.000',-4.00)
INSERT INTO #tmp 
VALUES (2, 'EST', '2022-11-06 06:00:00.000', '2023-03-12 07:00:00.000', -5.00)

create table #tran(id int primary key, DateTimeUTC datetime)
insert into #tran(id,DateTimeUTC) values (1,'2022-11-05 07:00:00.000'),(2,'2022-11-10 06:00:00.000')


select t.id, t.DateTimeUTC, dateadd(hour,offset,t.DateTimeUTC) DateTimeLocal, tz.offset
from #tran t
join #tmp tz
  on t.DateTimeUTC >= tz.StartDate
 and t.DateTimeUTC < tz.EndDate

产出

id          DateTimeUTC             DateTimeLocal           offset
----------- ----------------------- ----------------------- ---------------------------------------
1           2022-11-05 07:00:00.000 2022-11-05 03:00:00.000 -4.00
2           2022-11-10 06:00:00.000 2022-11-10 01:00:00.000 -5.00

SQL Server 2016 及更高版本具有偏移量 built-in,因此您可以编写类似

的查询
select t.id, 
       t.DateTimeUTC, 
       cast(t.DateTimeUTC at time zone 'UTC' at time zone 'EASTERN STANDARD TIME' as datetime) DateTimeLocal
from #tran t