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

时间:2013-11-20 02:29:03

标签: sql-server getdate

我希望在数据类型为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导致白天节电时间变化的原因。结果,我每次都需要改变它。有人有解决方案吗?

感谢。

5 个答案:

答案 0 :(得分:13)

您可以使用SYSDATETIMEOFFSET功能

select SYSDATETIMEOFFSET()

MSDN说明:

  

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

更多关于MSDN.


根据以下评论中的澄清:

因为您想存储客户端的本地时间,所以SQL Server无法知道您的本地时间。最有效的选择是每次从客户端发送当前时间。

答案 1 :(得分:5)

从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

答案 2 :(得分:3)

答案 3 :(得分:0)

由于db时区信息与您的Web服务器不同,因此您最好将所需的日期时间值从Web应用程序显式传递到db,而不是使用db server-side default function。

答案 4 :(得分:0)

def callback(text: Text):
    text.delete('1.0', END)
    text.insert(END, 'text1\r\n')
    text.insert(END, 'text2\r\n')
    text.update()
    text.insert(END, 'text3\r\n')
    text.insert(END, 'text4\r\n')
    text.insert(END, 'text5\r\n')
    text.insert(END, 'text6\r\n')
    text.insert(END, 'text7\r\n')

您需要第一个“ AT TIME ZONE UTC”(AT时区UTC)以告知数据库当前值,因此它知道如何到达第二个给定的时区。