Sql server Azure SQL显示本地时间
我正在尝试以本地时间显示日期时间值。默认情况下,Azure SQL数据库以UTC格式存储日期和时间,这是无法避免的。(从本地SQL Server迁移时很痛苦。)我希望以中欧时间显示存储的时间值 现在当地时间是11:30(CET)。UTC时间是10:30Sql server Azure SQL显示本地时间,sql-server,tsql,timezone,azure-sql-database,Sql Server,Tsql,Timezone,Azure Sql Database,我正在尝试以本地时间显示日期时间值。默认情况下,Azure SQL数据库以UTC格式存储日期和时间,这是无法避免的。(从本地SQL Server迁移时很痛苦。)我希望以中欧时间显示存储的时间值 现在当地时间是11:30(CET)。UTC时间是10:30 DECLARE @TestTime DATETIME; SET @TestTime = '2016-11-02 10:30:00' SELECT @TestTime --Returns 2016-11-02 10:30:00 SELECT @T
DECLARE @TestTime DATETIME;
SET @TestTime = '2016-11-02 10:30:00'
SELECT @TestTime
--Returns 2016-11-02 10:30:00
SELECT @TestTime AT TIME ZONE 'Central European Standard Time'
--Returns 02 November 2016 10:30:00 +01:00
我需要以某种方式返回2016-11-02 11:30:00。现在来看有趣的部分:
有人建议:
这很有效,但让我恶心:
SELECT DATEADD(MINUTE,DATEPART(tz,@TestTime AT TIME ZONE 'Central European Standard Time'),@TestTime)
--Returns 2016-11-02 11:30:00
也有人提出了类似的解决方案,但它使用字符串操作。我的怀疑是,在时区出现了问题;它应该显示11:30+1,而不是10:30+1,不是吗
是否真的没有合适的方法在本地时间中显示UTC时间?这种“黑客入侵”感觉非常肮脏,特别是在任何时候它都可能停止工作(例如,Microsoft修复/引入了一个bug)
谢谢 时区
语句执行两种不同的操作:
断言datetime
(或datetime2
)位于特定时区,从而查找该时区的正确偏移量,并返回应用了正确偏移量的datetimeoffset
值
若要将datetimeoffset
值转换为不同的时区,请使用与源值的偏移量确定准确的时间点,然后查找请求时区的新偏移量并应用它。这将返回一个datetimeoffset
,其本地时间和偏移量可能与原始时间和偏移量不同,但表示相同的时间点
您仅使用第一部分。要将datetime
从UTC转换为特定时区,您需要同时使用这两种方法
时区的第一个断言输入的datetime
是UTC格式的,导致偏移量为+00:00
的datetimeoffset
。时区处的第二个语句将其转换为请求的时区。时区处的语句执行两个不同的操作:
断言datetime
(或datetime2
)位于特定时区,从而查找该时区的正确偏移量,并返回应用了正确偏移量的datetimeoffset
值
若要将datetimeoffset
值转换为不同的时区,请使用与源值的偏移量确定准确的时间点,然后查找请求时区的新偏移量并应用它。这将返回一个datetimeoffset
,其本地时间和偏移量可能与原始时间和偏移量不同,但表示相同的时间点
您仅使用第一部分。要将datetime
从UTC转换为特定时区,您需要同时使用这两种方法
时区的第一个断言输入的datetime
是UTC格式的,导致偏移量为+00:00
的datetimeoffset
。时区的第二个将其转换为所请求的时区。您到底想用什么来显示本地日期和时间?@drediske-in。我想在示例中看到的是11:30。(实际上,我的db有来自其他几个时区的用户,夏令时也开始使用,所以它有点复杂。)它归结为能够将存储的UTC时间值转换为所需的本地时间。我喜欢这些未注释的-1。。。如果选民给了我启发,我很想改进这个问题。我知道你想要CET——我的意思是,你是如何公布数据的?通过使用本地系统时区,您的转换可能比CET硬设置更适合(比如在网页上)。UTC(和云)已取消本地化,您希望撤消此操作。为什么不在最后一刻(比如,在你的网页上)做呢?@drediske哦,我现在明白了。这些时间戳是订单时间。这并不取决于用户的本地设置,而是取决于他们订购的公司所在国。此设置来自DB-每个公司都有一个时区字段。你说的“尽可能晚”是对的。我只是将网站上使用的视图和SP-s放在一起,我不想存储本地化时间。。看到我们的网络开发人员正在从所有的毛孔中渗出,我想我应该减轻他们的负担,提供随时可用的数据。你到底想用什么来显示本地日期时间?@drediske-in。我想在示例中看到的是11:30。(实际上,我的db有来自其他几个时区的用户,夏令时也开始使用,所以它有点复杂。)它归结为能够将存储的UTC时间值转换为所需的本地时间。我喜欢这些未注释的-1。。。如果选民给了我启发,我很想改进这个问题。我知道你想要CET——我的意思是,你是如何公布数据的?通过使用本地系统时区,您的转换可能比CET硬设置更适合(比如在网页上)。UTC(和云)已取消本地化,您希望撤消此操作。为什么不在最后一刻(比如,在你的网页上)做呢?@drediske哦,我现在明白了。这些时间戳是订单时间。这并不取决于用户的本地设置,而是取决于他们订购的公司所在国。此设置来自DB-每个公司都有一个时区字段。你说的“尽可能晚”是对的。我只是将网站上使用的视图和SP-s放在一起,我不想存储本地化时间。。看到我们的网络开发人员正在从所有的毛孔中流血,我想我应该减轻他们的负担,提供随时可用的数据。另外,我注意到你的个人资料上说你在布达佩斯,因此使用“中欧标准时间”
区域更为正确。虽然在这种情况下,有
SELECT DATEADD(MINUTE,DATEPART(tz,@TestTime AT TIME ZONE 'Central European Standard Time'),@TestTime)
--Returns 2016-11-02 11:30:00
SELECT @TestTime AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time'