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 顺序不正确

如何在 SQL Server中 将日期格式化

Presto SQL - 将日期字符串转换为日期格式

有没有办法在 SQL Server 中将日期格式化为 MM DD YYYY 而不是 YYYYMMDD? [复制]

如何在sql中将带时区的varchar转换为日期时间

Sql Server中日期时间格式化为字符串输出