TSQL:从字符串转换日期和/或时间时转换失败
Posted
技术标签:
【中文标题】TSQL:从字符串转换日期和/或时间时转换失败【英文标题】:TSQL : Conversion failed when converting date and/or time from character string 【发布时间】:2018-04-12 17:27:01 【问题描述】:我有一个正在运行的查询,但是在再次导入一个表后,我在将 Varchar 转换为 DateTime 时看到了以下问题。
运行以下查询时遇到以下问题:
select FORMAT(convert (datetime,date) , 'ddMMyyyy') from kat.[dbo].[myTable]
如果我尝试以下操作,我会看到同样的问题:
SELECT convert(datetime, date, 126) from kat.[dbo].[myTable]
我在主表中的日期遵循相同的格式:
2017-09-01
使用格式的数据屏幕截图编辑:
提前致谢,
凯特
【问题讨论】:
那么日期的格式是什么?是 yyyy-MM-dd、yyyy-dd-MM 还是 ddMMyyyy? 日期如前所述,格式如下:2017-09-01 -> yyyy-MM-dd 你没有提到,它可能是 yyyy-dd-MM,特别是因为它已经不同于你第一次提到的格式。 如果我使用 select FORMAT(convert (datetime,date) , 'yyyy-MM-dd') from kat.[dbo].[myTable] 我也看到了错误 【参考方案1】:我实际上认为字符串不能直接转换为日期(至少在您使用 CAST 时不能)...为什么不先将字符串转换为 int 呢?
假设您的列名为 [Date],我会坚持:
SELECT
cast(DATEADD(DAY, cast([Date] as int), -2) as date) as [Date]
FROM kat.[dbo].[myTable]
如果你有不同的列名,这里是模板:
SELECT
cast(DATEADD(DAY, cast([MyColumnName] as int), -2) as date) as [MyColumnName]
FROM kat.[dbo].[myTable]
另外,我还使用 CONVERT 更新了您的代码(老实说,我很少每次都使用它,所以它可能是错误的)
SELECT convert(datetime, convert(int, [Date]), 126) from kat.[dbo].[myTable]
【讨论】:
【参考方案2】:我在主表中的日期遵循相同的格式:
2017-09-01
您的表格中有一些具有不同格式的刺。
尝试使用以下代码捕获它们:
select *
from kat.[dbo].[myTable]
where dt not like '[1-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]';
以后不要将日期时间值存储为字符串,使用datetime
/date
。
更新
因此,您的字符串类似于 '2017-09-01'
是不正确的
这是我的日期示例:
declare @t table (dt varchar(20));
insert into @t values ('2017-09-01');
select *
from @t
where dt not like '[1-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]';
我的代码不返回任何行,因为 '2017-09-01'
反映了您所暗示的格式,如果它返回您的所有行,则格式不同。
【讨论】:
您好 sepupic,此查询显示表的所有记录。有没有更好的方法将这些字符串转换为日期时间? 那么问题出在哪里?他们错过了分隔符什么?能举个例子吗? 我用你的字符串更新了我的答案,我的代码没有返回'2017-09-01'行,所以你的字符串不是那种格式。我重复我的问题,你的字符串的真正格式是什么? varchar 是一种数据类型,而不是一种格式。格式是 yyyy-mm-dd,如果相信 OP,但它不是你的字符串的真实格式。如果您无法确定格式,为什么不能发布您的字符串示例? 我已经用数据截图编辑了主帖以上是关于TSQL:从字符串转换日期和/或时间时转换失败的主要内容,如果未能解决你的问题,请参考以下文章
转换输入时间时从字符串转换日期和/或时间时转换失败 | SQL, SQLSRV