【问题标题】:Why can't I insert yyyymmdd (stored as text) to a date column为什么我不能将 yyyymmdd(存储为文本)插入日期列
【发布时间】:2020-01-12 15:18:25
【问题描述】:

这已经被问过很多次了,我在发布这个问题之前尝试了很多次。我的 SQL Server 表上有 2 列,其中日期存储为 CHAR(8) yyyymmdd 格式。当我尝试将此插入到另一个带有日期列的表中时,我得到:

从字符串转换日期和/或时间时转换失败。

我使用的类型转换是:

    ,CAST(convert(char(10),qrda.BillFromDate,120) AS DATE) AS [BillStartDate]
    ,CAST(convert(char(10),qrda.BillToDate,120) AS DATE) AS [BillEndDate]

使用上面的代码,我试图使其 SQL Server 可读的日期格式,然后将其类型转换为 DATE,以便我可以将其插入目标表而无需任何其他转换。不知道我哪里出了问题。

【问题讨论】:

标签: sql sql-server tsql datetime type-conversion


【解决方案1】:

抱歉,麻烦各位了,但看起来这是糟糕的生产数据,其中一些值实际上是“00000000”。我不知道这如何流入我们的系统,但由于源表列是 CHAR(8),因此这是一个有效值。对我来说不是那么多。

【讨论】:

  • 哎呀。这进一步证明为您存储的内容选择正确的数据类型非常重要。您是否有机会修复表格并将日期存储为日期而不是字符串?
  • 我将与数据的所有者讨论这个问题,但我目前无法控制它是如何加载的。如果我最初开发了这个,我就不会选择如此糟糕的做法。
  • 我感觉到你的痛苦。我们经常根据其他人做出的错误决定而得到一些东西,并且不得不处理后果。从您目前的情况来看,来自 Hadi 的 TRY_PARSE 是您拥有的最佳选择。
【解决方案2】:

由于日期以以下格式存储yyyyMMdd,因此您可以插入这些值而无需使用CONVERTCAST 函数,因为这种格式可以隐式转换为DATE。

如果数据中包含00000000等无效值,可以使用TRY_CONVERTTRY_PARSE函数将这些值转换为NULL

例子:

CREATE TABLE #TBLTEMP(datecolumn DATETIME)


INSERT INTO #TBLTEMP(datecolumn)
VALUES ('20180101')

INSERT INTO #TBLTEMP(datecolumn)
VALUES (TRY_PARSE('00000000' as DATETIME))


SELECT * FROM #TBLTEMP

结果:

从上面的例子中,你可以看到20180101被成功插入,没有任何转换,而TRY_PARSE函数将无效值00000000转换为NULL

您可以使用以下语法:

INSERT INTO TargetTable(DateColumn)
SELECT TRY_PARSE([CharColumn] as DATETIME
FROM SourceTable

参考文献

【讨论】:

  • 我将把它标记为答案,因为这些似乎完全适合糟糕的数据情况。谢谢1
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2020-07-07
相关资源
最近更新 更多