首页 > 解决方案 > SQL - 日期存储为 varchar 但格式化为 Julian Date

问题描述

我浏览过类似的帖子,并没有完全找到我的确切问题。基本上,我刚开始在一家公司工作,该公司现在正在与承包商一起构建数据库。我们的每个日期字段都以 Julian 格式“20190101”存储,但它们被格式化为 Varchar 而不是 DateTime。

这对于在 SQL 中使用与日期相关的函数显然是有问题的。最终,我计划让我们的承包商脚踏实地,并告诉他们改变它。但是根据我的研究,我找不到任何真正的理由来创建数据库而不使用 DateTime 格式的日期而不是懒惰。

将日期时间格式存储为 varchar 是否有任何正当理由?其次,如果这是我所坚持的,有人能告诉我我能做些什么来把它变成一种可行的格式吗?我的大部分查询都希望提取前 365 - 730 天的数据。

我目前收到错误消息“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。” 在以下代码行:

WHERE Promise_Date > DATEADD(year,-1, GETDATE())

标签: sqldatetime

解决方案


您应该找到转换失败的地方:

SELECT Promise_Date
FROM t
WHERE TRY_CONVERT(date, Promise_Date) IS NULL;

同时,使转换显式:

WHERE TRY_CONVERT(date, Promise_Date) > DATEADD(year,-1, GETDATE())

通常,没有充分的理由将数据存储为字符串。如果您确实使用字符串,那么 YYYYMMDD 是一个非常好的选择。SQL Server 将始终正确地转换它。就您而言,您的价值观不好。

在某些情况下,日期和非日期需要存储在同一字段中。例如,我曾经在衍生品在特定日期定价的环境中工作——但它们也可以指定为“纽约收盘”或“伦敦开盘”或类似的东西,以表示“商业”日期。


推荐阅读