Getdate() 函数获取我的时区的日期

Posted

技术标签:

【中文标题】Getdate() 函数获取我的时区的日期【英文标题】:Getdate() function to get date for my timezone 【发布时间】:2013-11-20 02:29:03 【问题描述】:

我希望在数据类型为 datetime2(7) 的列中插入一个默认值。但是,由于我的网站托管在不同时区的服务器上,因此 getdate 功能无法正常工作。我想知道是否有解决方案。我做了一些研究,发现了两种方法。 首先是使用 GetUTCDate() 函数。但是,我需要在显示信息时进行转换。我确信我的 Web 应用程序仅用于我的时区。所以我想避免这种情况。 第二种方式,这是我可以通过使用 SwitchOffSet 函数完成的最接近的方式:

CREATE TABLE [dbo].[Test_Date](
[test_id] [int] NOT NULL,
[test_date] [datetime2](7) NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Test_Date] ADD  CONSTRAINT [DF_Test_Date_test_date]  DEFAULT (switchoffset(CONVERT([datetimeoffset],getutcdate()),'+13:00')) FOR [test_date]
GO

但是,我的问题是未来几个月的 +13:00 原因,它将是夏令时更改的 +12:00 原因。结果,我每次都需要更改它。有人有解决办法吗?

谢谢。

【问题讨论】:

【参考方案1】:
SELECT GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time'

您需要第一个'AT TIME ZONE UTC' 来告诉数据库当前的值是什么,因此它知道如何到达第二个给定时区,在我的示例中为'Central Standard Time'

【讨论】:

对于 Azure,这是要走的路。 @ejcortes 是的,我在写这个答案时在 Azure,所以它是从 Azure SQL Server 的角度来看的。 为什么 Azure 不能足够智能地将 getdate() 转换为 CST?为什么需要先转换为 UTC?【参考方案2】:

你可以使用SYSDATETIMEOFFSET函数

select SYSDATETIMEOFFSET()

MSDN 说明:

返回一个 datetimeoffset(7) 值,该值包含运行 SQL Server 实例的计算机的日期和时间。包括时区偏移量。

更多关于MSDN.


基于以下评论中的澄清:

因为要存储客户端的本地时间,SQL Server 无法知道您的本地时间。效果最好的最佳选择是每次都从客户端发送当前时间。

【讨论】:

sysdatetimeoffset() 不能解决我的问题。它会告诉我与 UTC 相比,我的专栏中的时间偏移量是多少。类似于 2007-04-30 13:10:02.0474381 -07:00。这不是我想要达到的。我想为我的时区插入日期和时间。谢谢 实际上,我确实知道我的客户的位置,而且它总是在我的时区。我的网络应用程序不允许从外部进行任何注册。谢谢【参考方案3】:

自 Sql Server 2016 起,您可以使用 AT TIME ZONE...

SELECT CONVERT(datetime2(0), '2015-03-29T01:01:00', 126)     
AT TIME ZONE 'Central European Standard Time';  

...as specified in the documentation

【讨论】:

但更实际的是,您正在转换一个 DATETIME 值......所以您需要首先给出当前值的“UTC”时区,这样它就知道如何到达下一个。跨度> 【参考方案4】:

只需将数据存储为 UTC,use a calendar table 以在您读取数据时计算偏移量(请参阅这些提示:part 1、part 2、part 3)。相关问答:

GET UTC Date of a past date Daylight saving time and time zone best practices Best Practices working with Datetimeoffset how to convert all datetime columns in a sql server 2005 express database with data to UTC Where to set a UTC datetime value in n-tier application: Presentation Layer, Domain, or Database? How do I handle the timezones for every Chat message

【讨论】:

【参考方案5】:

由于 db 时区信息与您的 Web 服务器不同,最好将您想要的日期时间值从您的 Web 应用程序显式传递给 db,而不是使用 db 服务器端默认函数。

【讨论】:

这是最明显的方式。但我尽量避免这种情况。已经写了这么多没有datetime参数的存储过程。谢谢。

以上是关于Getdate() 函数获取我的时区的日期的主要内容,如果未能解决你的问题,请参考以下文章

JS函数(获得widn)

日期函数

获取特定时区的时间[重复]

获取特定时区的时间[重复]

php面试题-2

date.getDate 不是函数打字稿