SQL - 日期存储为 varchar 但格式化为 Julian Date
Posted
技术标签:
【中文标题】SQL - 日期存储为 varchar 但格式化为 Julian Date【英文标题】:SQL - Date stored as varchar but formatted as Julian Date 【发布时间】:2019-10-29 19:04:40 【问题描述】:我浏览过类似的帖子,但还没有完全找到我的确切问题。基本上,我刚开始在一家公司工作,该公司现在正在与承包商一起构建数据库。我们的每个日期字段都以 Julian 格式“20190101”存储,但它们被格式化为 Varchar 而不是 DateTime。
这对于在 SQL 中使用与日期相关的函数显然是有问题的。最终,我计划让我们的承包商脚踏实地,并告诉他们改变它。但是根据我的研究,我找不到任何真正的理由来创建数据库而不使用 DateTime 格式的日期而不是懒惰。
是否有任何正当理由将日期时间格式存储为 varchar?其次,如果这是我所坚持的,有人能告诉我我能做些什么来把它变成一种可行的格式吗?我的大部分查询都希望提取前 365 - 730 天的数据。
我目前收到错误消息“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。”在以下代码行:
WHERE Promise_Date > DATEADD(year,-1, GETDATE())
【问题讨论】:
您使用的是什么关系型数据库? SQL 服务器?此外,“20190101”不是儒略日期。 我们使用的是 SQL Azure 【参考方案1】:你应该找到转换失败的地方:
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 将始终正确地转换它。在你的情况下,你的价值观很糟糕。
在某些情况下,日期和非日期可能需要存储在同一个字段中。例如,我曾经在衍生品在特定日期定价的环境中工作——但它们也可以指定为“纽约收盘”或“伦敦开盘”或类似的东西,以表示“营业”日期。
【讨论】:
你给我的第二个选项有效。实际上,我刚刚与我们的承包商交谈,实际上我正在查询我们的暂存数据库;他们说他们计划对实时版本进行适当的格式更改。以上是关于SQL - 日期存储为 varchar 但格式化为 Julian Date的主要内容,如果未能解决你的问题,请参考以下文章
按日期时间格式化为 dd.MM.yyyy 的 SQL 顺序不正确