【发布时间】:2021-06-22 14:59:42
【问题描述】:
为避免任何转换错误,我们想验证目标字符串是否可以使用 isdate 公式转换为日期时间,如下所示。
CASE WHEN isdate(@targetstring)= 1 then cast(@targetstring as datetime) else '1900-01-01 00:00:00' end
它按预期工作,它可以转换时返回1。
select isdate('2021-06-22 23:27:00')
select isdate('20210622')
select isdate('20210622 23:00:00')
但是yyyymmddhhmmss不能按预期工作,它返回0,即使字符串可以转换为日期时间。
select isdate('20210622230000')
如果我们使用它,它似乎可以工作。
select isdate(left('20210622230000', 8) + ' ' + substring('20210622230000', 9,2) + ':' + substring('20210622230000', 11,2) + ':' + substring('20210622230000', 13,2))
如果有更好的想法,请告诉我。谢谢。
【问题讨论】:
-
尝试
TRY_CONVERT/TRY_CAST,而不是有时(经常)错误的ISDATE/ISNUMERIC。 -
虽然,对我来说,
'20210622230000'不能在没有字符串操作的情况下转换为datetime;这使得字符串 not 本身就是一个有效的日期字符串。仅仅因为它可以通过操纵,并不意味着ISDATE或TRY_CONVERT足够“聪明”地知道这一点。 -
事实上,真正的问题似乎是您正在为日期(和时间)值存储文字字符串。
-
@Larnu 非常感谢您的及时回复。是啊,你说得对。 '20210622230000' 的 try_convert 返回 null。 '20210622 23:00:00' 工作正常。我们需要更改 yyyymmddhhmmss 位。无论如何,非常感谢您提供的有用信息:)
-
不想消极,但如果不是很明显,这就是糟糕的数据库设计。您只有这个问题,因为没有强制执行正确的数据类型(日期时间)。您无法以任何有意义的方式(日期范围等)搜索这些日期,也无法将其编入索引。您也不能在其上使用各种 SQL 日期时间函数(日、年、月、eomonth 等)。对于您能想到的这些日期的任何其他用途,SQL Server 会抛出错误,而不仅仅是这个查询。最好解决将非规范化(甚至不是 1NF)数据放入数据库而不是按原样用于查询的原因。
标签: sql-server datetime datetime-format