【发布时间】:2019-04-09 08:18:12
【问题描述】:
我们使用名为“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 Innovator 11.0 - CD 上的配置国际化指南 图片,第 5.3 节:
SELECT item_number, innovator.ConvertToLocal(created_on, 'Eastern 标准时间') AS CreatedOn FROM innovator.Document
ConvertFromLocal 可用于指定要查询的日期 反对而不是要求这些日期以 UTC 格式发送。
我不相信使用字符串会是一个好的解决方案。 但也不相信他们的“ConvertTo/FromLocal”函数会是一个好的解决方案。 肯定有其他方法可以直接在 SQL Server 中处理这个问题吗?
【问题讨论】:
-
我认为您的供应商的解决方案是正确的,并且是处理跨时区数据的最佳实现。如果您只存储日期,您基本上会掩盖您正在努力解决的时区问题,并且您可能至少有 24 个版本的“今天”要处理。 UTC 日期和时间将您的所有日期和时间都输入到 1 个时区,并且 ConvertToLocal 允许您确定任何给定查询中“今天”的位置。
-
问题是我们真的只关心全球范围内的日期。对我们来说,使用时区是没有意义的。想象一个大公司的生日日历(只是举一个简单的例子),你想找到所有在 4 月 9 日出生的员工,无论他们出生在哪个时区或用户当前的时区是什么。或者所有 1980 年 5 月 5 日之后出生的员工。引入时区只会造成混乱。
标签: sql-server date datetime timezone