SQL 将 varchar 转换为 datetime 仅

SQL Convert varchar to datetime is only

提问人:akBen 提问时间:9/14/2023 更新时间:9/14/2023 访问量:53

问:

我有一个查询,我想从中将 varchar 转换为日期时间,但我得到了一个我无法理解的结果。 例如:我有一个 varchar 字段 (cAnmerkung),我在其中使用 charindex() 和 substring() 提取德国日期 12.02.2019。这是必要的,因为 varchar 中的日期在特定文本('HereItIs: 12.02.2019')之后,然后我更改此日期以便能够使用 replace() 将其转换为日期时间。最后,convert() 到 datetime 正在工作:

select a.cArtNr, SUBSTRING(b.cAnmerkung, CHARINDEX('HereItIs',b.cAnmerkung)+13 , 10) as 'GermanDate'
, replace(SUBSTRING(b.cAnmerkung, CHARINDEX('HereItIs',b.cAnmerkung)+13 , 10), '.', '/') as 'testFormat'
, convert(datetime, replace(SUBSTRING(b.cAnmerkung, CHARINDEX('HereItIs',b.cAnmerkung)+13 , 10), '.', '/'), 103) as 'ConvertedDate'
from tOrder b 
join tPosition p on p.tBestellung_kBestellung = b.kBestellung 
join tArticel a on a.kArtikel = p.tArtikel_kArtikel 
join tStock l on l.kArtikel = a.kArtikel
where b.cAnmerkung LIKE '%HereItIs%' 
and l.fLagerbestandEigen > 0
and SUBSTRING(b.cAnmerkung, CHARINDEX('HereItIs',b.cAnmerkung)+13 , 10) NOT LIKE '[A-Za-z]%'

此查询正在工作。我得到这个结果:resultExample

我现在的问题是,我需要删除列“testFormat”。但是一旦我删除了这部分查询:

, replace(SUBSTRING(b.cAnmerkung, CHARINDEX('HereItIs',b.cAnmerkung)+13 , 10), '.', '/') as testFormat

我收到错误:

“将字符串转换为日期和/或时间时出错。”

有谁知道为什么当我在 select() 中有 replace() 时,同一个查询只将 varchar 转换为日期时间?

sql-server 日期时间

评论

2赞 siggemannen 9/14/2023
您可能有一些无法投射的数据。有时,SQL Server 会选择不同的路径来实现该选择,然后失败。您可以将 convert 替换为 TRY_CONVERT,以便在失败时失败
0赞 Thom A 9/14/2023
我认为真正的问题是,为什么要首先存储日期(和时间)数据?如果使用实际的日期和时间数据类型,则无法存储无效的日期。你真的应该寻求修复你的设计。varchar
0赞 akBen 9/14/2023
@siggemannen谢谢!try_convert() 正在工作。我不知道为什么我没有想到这一点。我仍然对结果感到困惑。使用 replace() 和 convert() 后,我得到了 1855 行。当我删除 replace() 并使用 try_convert() 时,我仍然得到 1855 行。所以在我看来,因为没有无法转换的数据。我可以将评论标记为解决方案吗?
0赞 akBen 9/14/2023
@ThomA 日期只是用户在注释字段中输入的内容。我只想提取那个手工制作的日期并使用它。在我们的程序中,我无法放置新字段,因此用户可以添加这些日期以适当的方式存储。这不是我的设计,我无法更改它。哎呀。
1赞 siggemannen 9/14/2023
可以,但 SQL Server 可能会遍历不同数量的其他行,具体取决于您正在运行的查询。

答: 暂无答案