osh*_*nen 6 sql t-sql sql-server dst
背景:
我对夏令时更改有疑问。输入到数据库中的任何记录(旁注:我无法访问输入此数据的脚本/代码以修复它)2021-03-28和2021-10-31以不正确的日期输入到数据库中。例如:
输入的记录2021-03-26最终在数据库中作为2021-03-26 00:00:00,这是正确的。
输入的记录2021-03-29最终会出现在数据库中,因为2021-03-28 23:00:00这是不正确的。
因此,当我尝试搜索在 on 中输入的记录时2021-03-26,查询工作正常,但是如果我尝试搜索在 on 中输入的2021-03-29记录,由于时间更改,它会返回错误日期的记录。
样本数据:
ColDate, ColName
2021-03-26 00:00:00, SomeName -- CORRECT DATE
2021-03-26 00:00:00, SomeName -- CORRECT DATE
2021-03-26 00:00:00, SomeName -- CORRECT DATE
2021-03-28 23:00:00, SomeName -- INCORRECT DATE
2021-03-28 23:00:00, SomeName -- INCORRECT DATE
2021-03-28 23:00:00, SomeName -- INCORRECT DATE
Run Code Online (Sandbox Code Playgroud)
工作示例:
DECLARE @StartDate datetime
DECLARE @EndDate datetime
SET @StartDate = '2021-03-26 00:00:00'
SET @EndDate = '2021-03-26 23:59:59'
SELECT *
FROM tblName
WHERE ColDate BETWEEN @StartDate AND @EndDate
Run Code Online (Sandbox Code Playgroud)
以上将返回:
ColDate, ColName
2021-03-26 00:00:00, SomeName -- CORRECT DATE
2021-03-26 00:00:00, SomeName -- CORRECT DATE
2021-03-26 00:00:00, SomeName -- CORRECT DATE
Run Code Online (Sandbox Code Playgroud)
无工作示例:
DECLARE @StartDate datetime
DECLARE @EndDate datetime
SET @StartDate = '2021-03-29 00:00:00'
SET @EndDate = '2021-03-29 23:59:59'
SELECT *
FROM tblName
WHERE ColDate BETWEEN @StartDate AND @EndDate
Run Code Online (Sandbox Code Playgroud)
以上将不会从示例数据中返回任何内容。
题:
我该如何解决这个问题?如前所述,我无法控制数据输入,开发人员也没有兴趣解决这个问题。
我是否需要使用IF报表并检查日期是否在 2021-03-28 和 2021-10-31 之间并相应地将日期调整 1 小时?或者有没有更好的方法来解决这个问题?
更新 - 可能的解决方案:
以下查询似乎有效 (2021-03-26):
DECLARE @StartDate datetime
DECLARE @EndDate datetime
SET @StartDate = '2021-03-26 00:00:00'
SET @EndDate = '2021-03-26 23:59:59'
SELECT
ColDate AT TIME ZONE 'UTC' AT TIME ZONE 'GMT Standard Time',
ColName
FROM tblName
WHERE ColDate BETWEEN @StartDate AT TIME ZONE 'GMT Standard Time' AT TIME ZONE 'UTC' AND @EndDate AT TIME ZONE 'GMT Standard Time' AT TIME ZONE 'UTC'
Run Code Online (Sandbox Code Playgroud)
以下查询似乎有效 (2021-03-29):
DECLARE @StartDate datetime
DECLARE @EndDate datetime
SET @StartDate = '2021-03-29 00:00:00'
SET @EndDate = '2021-03-29 23:59:59'
SELECT
ColDate AT TIME ZONE 'UTC' AT TIME ZONE 'GMT Standard Time',
ColName
FROM tblName
WHERE ColDate BETWEEN @StartDate AT TIME ZONE 'GMT Standard Time' AT TIME ZONE 'UTC' AND @EndDate AT TIME ZONE 'GMT Standard Time' AT TIME ZONE 'UTC'
Run Code Online (Sandbox Code Playgroud)
更新 - 问题:
上述更新似乎有效,但我忽略了什么吗?
您更新的答案看起来很棒。但是,如果正确输入的日期始终没有时间,并且只输入了不正确的时间部分,那么您也可以在 where 子句中使用 @startdate 时从 @startdate 中减去 1 小时。
DECLARE @StartDate datetime
DECLARE @EndDate datetime
SET @StartDate = '2021-03-29 00:00:00'
SET @EndDate = '2021-03-29 23:59:59'
SELECT *
FROM tblName
WHERE ColDate BETWEEN dateadd(day,-1,@StartDate) AND @EndDate
Run Code Online (Sandbox Code Playgroud)
但如果存在除夏令时问题之外的时间部分的行,则它将不起作用。
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |