Sql server 如何根据GMT计算当地时间?

Sql server 如何根据GMT计算当地时间?,sql-server,azure-sql-database,azure-sqldw,azure-sql-server,azure-sql-reporting,Sql Server,Azure Sql Database,Azure Sqldw,Azure Sql Server,Azure Sql Reporting,我正试图根据格林尼治标准时间(GMT)的数据计算出各国的当地时间。我还需要知道他们是否也遵守夏令时。有没有办法在没有CLR的情况下实现这一点?这里有一些样本数据供您参考 DDL: CREATE TABLE #Temp( COUNTRY_CODE VARCHAR(2) DATETIME VARCHAR(50) ); INSERT INTO #Temp(COUNTRY_CODE, DATETIME) VALUES ('EE', 'Sun Mar 29 00:00:00 GMT 1992'), ('

我正试图根据格林尼治标准时间(GMT)的数据计算出各国的当地时间。我还需要知道他们是否也遵守夏令时。有没有办法在没有CLR的情况下实现这一点?这里有一些样本数据供您参考

DDL:

CREATE TABLE #Temp(
COUNTRY_CODE VARCHAR(2)
DATETIME VARCHAR(50)
);
INSERT INTO #Temp(COUNTRY_CODE, DATETIME)
VALUES
('EE', 'Sun Mar 29 00:00:00 GMT 1992'),
('AZ', 'Sun Mar 28 00:00:00 GMT 1993'),
('CZ', 'Sun Mar 27 00:00:00 GMT 1994'),
('DE', 'Sun Mar 26 00:00:00 GMT 1995'),
('AD', 'Sun Mar 31 00:00:00 GMT 1996'),
('GI', 'Sun Mar 30 00:00:00 GMT 1997'),
('DK', 'Sun Mar 29 00:00:00 GMT 1998'),
('AL', 'Sun Mar 28 00:00:00 GMT 1999'),
('ES', 'Sun Mar 26 00:00:00 GMT 2000'),
('LT', 'Sun Mar 25 00:00:00 GMT 2001');
DML:

CREATE TABLE #Temp(
COUNTRY_CODE VARCHAR(2)
DATETIME VARCHAR(50)
);
INSERT INTO #Temp(COUNTRY_CODE, DATETIME)
VALUES
('EE', 'Sun Mar 29 00:00:00 GMT 1992'),
('AZ', 'Sun Mar 28 00:00:00 GMT 1993'),
('CZ', 'Sun Mar 27 00:00:00 GMT 1994'),
('DE', 'Sun Mar 26 00:00:00 GMT 1995'),
('AD', 'Sun Mar 31 00:00:00 GMT 1996'),
('GI', 'Sun Mar 30 00:00:00 GMT 1997'),
('DK', 'Sun Mar 29 00:00:00 GMT 1998'),
('AL', 'Sun Mar 28 00:00:00 GMT 1999'),
('ES', 'Sun Mar 26 00:00:00 GMT 2000'),
('LT', 'Sun Mar 25 00:00:00 GMT 2001');
环境: Microsoft Azure SQL数据仓库-10.0.10783.0 2019年10月26日23:24:02版权所有(c)Microsoft Corporation


谢谢

这很混乱,因为您的数据很复杂。您还有很长的路要走,我建议您将“
DateTime
”列更改为正确的数据类型,而不是使用计算列:

--Create sample table
CREATE TABLE dbo.YourTable (CountryCode char(2),
                            NotADateTime varchar(50));

INSERT INTO dbo.YourTable (CountryCode,
                           NotADateTime)
VALUES ('EE', 'Sun Mar 29 00:00:00 GMT 1992'),
       ('AZ', 'Sun Mar 28 00:00:00 GMT 1993'),
       ('CZ', 'Sun Mar 27 00:00:00 GMT 1994'),
       ('DE', 'Sun Mar 26 00:00:00 GMT 1995'),
       ('AD', 'Sun Mar 31 00:00:00 GMT 1996'),
       ('GI', 'Sun Mar 30 00:00:00 GMT 1997'),
       ('DK', 'Sun Mar 29 00:00:00 GMT 1998'),
       ('AL', 'Sun Mar 28 00:00:00 GMT 1999'),
       ('ES', 'Sun Mar 26 00:00:00 GMT 2000'),
       ('LT', 'Sun Mar 25 00:00:00 GMT 2001'),
       ('FR', 'Sun Jul 14 00:00:00 GMT 2019'); --Add one that is in DST.
GO
--Create a proper datetimeoffset column
ALTER TABLE dbo.YourTable ADD ADateTime AS TRY_CONVERT(datetimeoffset(0),RIGHT(NotADateTime,4) + '-' +
                                                                         CASE SUBSTRING(NotADateTime,5,3) WHEN 'Jan' THEN '01'
                                                                                                             WHEN 'Feb' THEN '02'
                                                                                                             WHEN 'Mar' THEN '03'
                                                                                                             WHEN 'Apr' THEN '04'
                                                                                                             WHEN 'May' THEN '05'
                                                                                                             WHEN 'Jun' THEN '06'
                                                                                                             WHEN 'Jul' THEN '07'
                                                                                                             WHEN 'Aug' THEN '08'
                                                                                                             WHEN 'Sep' THEN '09'
                                                                                                             WHEN 'Oct' THEN '10'
                                                                                                             WHEN 'Nov' THEN '11'
                                                                                                             WHEN 'Dec' THEN '12'
                                                                         END + '-' + SUBSTRING(NotADateTime,9,2) + 'T' +
                                                                         SUBSTRING(NotADateTime,12,9));

GO
--Check data
SELECT YT.CountryCode,
       YT.NotADateTime,
       YT.ADateTime
FROM dbo.YourTable YT;
GO     
--Add a timezone lookup table
CREATE TABLE dbo.TimeZoneLookup (CountryCode char(2),
                                 MSTimeZoneName nvarchar(128));
INSERT INTO dbo.TimeZoneLookup (CountryCode,
                                MSTimeZoneName)
SELECT CountryCode,'Central Europe Standard Time' --All apepar to be european countries, so jsut assumed. You should NOT. 
FROM dbo.YourTable; --You can find all the timezones in sys.time_zone_info


GO
--JOIN and change timezone
SELECT YT.CountryCode,
       YT.ADateTime,
       YT.ADateTime AT TIME ZONE TZ.MSTimeZoneName
FROM dbo.YourTable YT
     JOIN dbo.TimeZoneLookup TZ ON YT.CountryCode = TZ.CountryCode

GO
--Clean up
DROP TABLE dbo.YourTable;
DROP TABLE dbo.TimeZoneLookup;

为什么要将日期和时间存储为
varchar
?你的格式很难处理。将时间存储为日期和时间数据类型,然后使用或。另外,请注意,某些国家(例如示例中的德国(DE)和西班牙(ES))使用日光节约,这意味着它们会更改偏移量。GMT,我想你也指UTC,而不是英国的时间(英国也使用DST,所以夏天的时间是UTC+01:00,而不是UTC)。+10代表拉努的所有分数。此外,该表既不需要也不可能起作用。国家没有固定的偏移量,它们有多个偏移量和DST规则<代码>在时区已经处理好了。SQL Server 2016+已经有一个时区表。每个人都抱怨它使用Windows时区名称,而不是事实上的标准IANA时区名称。为什么你要将同一个问题独立发布到多个论坛?像@Julaayi
一样,在虚拟机上选择getdate()
(假设虚拟机处于正确的时区),并将该值复制到DW的表或变量中。然后在DW中执行
datediff(minute,@DateFromVM,getdate())
,以获取UTC的当前分钟偏移量。我从旧应用程序获取日期,我无法控制它。因此,在将其输入DW之前,我必须对其进行相应的处理。