sql—从dst的日期开始获取行的正确方法?

yks3o0rb  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(440)

我有一个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%确定它是这样工作的,还是我遗漏了什么。

fhg3lkii

fhg3lkii1#

首先,找出你想要比较的时间:

-- Get the current date in the given time zone
DECLARE @today date = convert(date, sysdatetimeoffset() AT TIME ZONE 'Eastern Standard Time')

-- Get the date one week ago
DECLARE @dateOneWeekAgo date = DATEADD(week, -1, @today)

-- Join the date with the desired time (local to the same time zone)
DECLARE @since datetime = convert(datetime, @dateOneWeekAgo) + convert(datetime, timefromparts(1, 0, 0, 0, 0))

然后比较一下:

SELECT * FROM table WHERE changedate >= @since

假设你 changedate 字段是 datetime 或者 datetime2 . 如果它是一个 datetimeoffset ,应首先将目标值转换为 datetimeoffset 在同一个时区,并使用它来代替:

DECLARE @sinceDTO datetimeoffset = @since AT TIME ZONE 'Eastern Standard Time'

关于你在问题中提出的方法,有两个问题: getdate() 基于服务器的本地时区给出时间。有可能不是东部时间的同一天。
你不应该应用一个函数(无论是一个 AT TIME ZONE 或其他内容),因为它使查询不可搜索。换句话说,sql必须扫描整个表,而不是使用索引。表越大,查询速度就越慢。

相关问题