我有一个datetime列, changedate
,我需要使用它来获取自下午1点以来上周更改的行。不幸的是,这个专栏是在当地时间(est)。服务器是microsoft sql server 2016。
我现在的问题是:
DECLARE @since datetime = DATEADD(week,-1,SMALLDATETIMEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE()), 13, 0)) AT TIME ZONE 'Eastern Standard Time'
SELECT * FROM table WHERE changedate AT TIME ZONE 'Eastern Standard Time' >= @since
因为我用的是 AT TIME ZONE
对于列和 @since
,这能正确解释dst的变化吗?根据我找到的文档,这是我的理解,但我不能100%确定它是这样工作的,还是我遗漏了什么。
1条答案
按热度按时间fhg3lkii1#
首先,找出你想要比较的时间:
然后比较一下:
假设你
changedate
字段是datetime
或者datetime2
. 如果它是一个datetimeoffset
,应首先将目标值转换为datetimeoffset
在同一个时区,并使用它来代替:关于你在问题中提出的方法,有两个问题:
getdate()
基于服务器的本地时区给出时间。有可能不是东部时间的同一天。你不应该应用一个函数(无论是一个
AT TIME ZONE
或其他内容),因为它使查询不可搜索。换句话说,sql必须扫描整个表,而不是使用索引。表越大,查询速度就越慢。