后台:
我对夏令时更改有疑问。在 2021-03-28
之间输入数据库的任何记录(旁注:我无法访问输入此数据的脚本/代码以修复它)和 2021-10-31
以错误的日期进入数据库。例如:
在 2021-03-26
上输入的记录最终在数据库中为 2021-03-26 00:00:00
, 哪个是正确的。
在 2021-03-29
上输入的记录最终在数据库中为 2021-03-28 23:00:00
这是不正确的。
因此,当我尝试搜索在 2021-03-26
上输入的记录时,查询工作正常,但如果我尝试搜索在 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
工作示例:
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
以上将返回: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
无工作示例:
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
以上将不会从示例数据中返回任何内容。问题:
我该如何解决这个问题?如前所述,我无法控制数据输入,开发人员也没有兴趣解决这个问题。
我是否需要使用
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'
以下查询似乎有效 (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'
更新 - 问题:
上述更新似乎有效,但我忽略了什么吗?
最佳答案
您更新后的答案似乎很棒。但是,如果正确输入的日期总是没有时间,并且只有不正确的日期与时间部分一起输入,那么您也可以在 where 子句中使用 @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
但如果有除夏令时问题以外的时间部分的行,它将不起作用。
关于sql - 夏令时导致数据库中的日期不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68002335/