sql - 为什么我不能将 yyyymmdd(存储为文本)插入日期列
问题描述
这已经被问过很多次了,在发布这个问题之前我尝试了很多次。我的 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,以便我可以将其插入目标表而无需任何其他转换。不知道我哪里出错了。
解决方案
由于日期以以下格式存储,yyyyMMdd
您可以插入这些值而无需使用CONVERT
或CAST
函数,因为这种格式可以隐式转换为 DATE。
如果数据中包含诸如 等无效值00000000
,可以使用TRY_CONVERT
orTRY_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
参考
推荐阅读
- git - 如何解决“open_stackdumpfile:将堆栈跟踪转储到 date.exe.stackdump”错误?
- sql-server - 使用 Powershell 导入多个 csv 文件并将其写入 MSSQL
- r - 将文本数据框转换为数字数据框会给出 NA 列表
- angular - 错误类型错误:(中间值)(中间值).init 不是函数 - Angular 6
- xml - 是元素节点的属性节点子节点
- android - ViewModel 和 LiveData 导入导致 NPE
- node.js - Restify中的路线
- spring - 同一端点上的 POX 和 SOAP
- angular - 除了popstate之外,还有其他方法可以检测浏览器的后退按钮吗?(Angular 6)
- c# - TPL BufferBlock.ReceiveAsync 两次接收相同的项目