sql - 夏令时导致数据库中的日期不正确

标签 sql sql-server tsql 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这是不正确的。
因此,当我尝试搜索在 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/

相关文章:

sql - 选择可以包含 2 列值的数据列表

mysql - 如何在 Slick 中使用 IN 子句?

sql-server - 使用SSIS Foreach循环循环多个文件夹

sql - 存储过程 T-SQL 中的递增/递减

sql - 在 SQL 中对分层文本进行排序

sql - VB.NET 中的 SUMIF SQL VIA OLEDB

php - 如何回显一个变量

SQL Server : error creating table with multiple primary keys

sql-server - 设计表以支持使用 sql server 更快地更新一个字段的最佳实践

sql - 在 SQL Server 中使用 FOR XML PATH 查询以获取分层数据的 XML 输出