当只有日期时间可用时,在 SQL Server 中处理日期的正确方法



我们使用名为"Aras Innovator"的 PLM 软件,需要将日期存储为自定义项目属性。该软件使用Microsoft SQL Server来存储其数据,并正式支持访问数据库级别的属性。

但是,我们的问题是该软件仅支持日期时间,不支持日期。 日期以 UTC 格式存储 - 因此,当我们存储来自中欧客户端的"2020-01-01"时,它会在数据库中变为"2019-12-31 23:00"左右(前一天午夜前 1 小时)。因此,检查">= 2020-01-01"的查询无法找到这些行。

软件制造商说:

没有仅存储月和日的标准功能; 快速选项可能是将其存储为字符串并执行 如果需要,对输入的字符串进行编程验证。

关于直接 SQL 查询,所有日期都以 UTC 格式存储 与多个时区兼容。它们会自动 通过标准 API 访问时转换。直接访问时 使用 SQL,您可以使用函数 ConvertToLocal 中描述的 Aras 创新者 11.0 - 光盘上的国际化配置指南 图片,第 5.3 节:

选择item_number,创新者。转换为本地(created_on,'东部 标准时间"),作为创建者从创新者。公文

ConvertFromLocal 可用于指定您要查询的日期 反对而不是要求以 UTC 发送这些日期。

我不相信使用字符串会是一个很好的解决方案。 但也不相信他们的"ConvertTo/FromLocal"功能会是一个很好的解决方案。 当然,一定有其他方法可以直接在SQL Server中处理这个问题吗?

>SQL Server 2016引入了AT TIME ZONE语句。

考虑:

SELECT CONVERT(date, TheDateTime AT TIME ZONE 'UTC'
AT TIME ZONE 'Central Europe Standard Time')

上面将首先TheDateTime字段从datetime或(datetime2)转换为偏移量为零的datetimeoffset类型(UTC)。 然后它会将其转换为Central Europe Standard Time区域,最后将其转换为date类型,删除任何时间信息。

就您的陈述而言:

...>= 2020-01-01",因此无法找到这些行。

您应该考虑转换相反的方向,以便您查询 UTC 时间 - 这将是可优化的。 例如:

SELECT ...
WHERE TheDateTime >= CONVERT(datetime,
'2020-01-01' AT TIME ZONE 'Central Europe Standard Time'
AT TIME ZONE 'UTC')

当然,您可以提前执行表达式的整个右侧,并改用局部变量。 同样,如果从应用程序调用此查询,则可以在应用程序代码中转换为 UTC,而根本不需要在 SQL Server 中执行此操作。

相关内容

  • 没有找到相关文章

最新更新