Sql server Getdate()函数,用于获取我所在时区的日期

Sql server Getdate()函数,用于获取我所在时区的日期,sql-server,getdate,Sql Server,Getdate,我希望在数据类型为datetime2(7)的列中插入一个默认值。但是,由于我的网站位于不同时区的服务器上,因此getdate函数无法正常工作。我想知道是否有办法解决这个问题。我做了一些研究,发现了两种方法。 首先是使用GetUTCDate()函数。但是,我需要在显示信息时进行转换。我确信我的web应用程序只用于我的时区。所以我想避免这种情况。 第二种方式,这是使用SwitchOffSet函数可以实现的最接近的方法: CREATE TABLE [dbo].[Test_Date]( [test_id

我希望在数据类型为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原因的日间节能时间变化。因此,我每次都需要更改它。有人能解决这个问题吗


谢谢

您可以使用
SYSDATETIMEOFFSET
函数

select SYSDATETIMEOFFSET()
MSDN说明:

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

更多关于


根据以下评论中的澄清:


由于要存储客户端的本地时间,SQL Server无法知道本地时间是多少。最好的选择是每次都从客户端发送当前时间。

由于数据库时区信息与您的web服务器不同,最好是您将所需的日期时间值从web应用显式传递到数据库,而不是使用数据库服务器端的默认功能。

只需将数据存储在UTC中,以及在读取数据时计算偏移量(请参见以下提示:,)。相关的:


自Sql Server 2016以来,您可以在时区使用

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


您需要第一个
“在UTC时区”
来告诉DB当前的值,这样它就知道如何到达第二个给定时区,在我的示例中,
“中央标准时间”

sysdatetimeoffset()不能解决我的问题。它将告诉我,与UTC相比,我列中的时间偏移量是多少。大概是2007-04-3013:10:02.0474381-07:00。这不是我想要实现的。我想插入时区的日期和时间。谢谢,事实上,我知道我客户的位置,而且总是在我的时区。我的web应用程序不允许从外部进行任何注册。谢谢这是最明显的方式。但如果可能的话,我尽量避免这样做。已经编写了很多没有datetime参数的存储过程。谢谢。这篇文章的链接显然已经不存在了!但更实际的是,您正在转换日期时间值。。。因此,您需要首先给出当前值的“UTC”时区,以便它知道如何到达下一个时区。对于Azure,这是一条路。@ejcortes yep我在写此答案时在Azure中,因此它是从Azure SQL Server的角度出发的。
SELECT GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time'