【问题标题】:SQL Server : How to validate for yyyymmddhhmmssSQL Server:如何验证 yyyymmddhhmmss
【发布时间】: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 本身就是一个有效的日期字符串。仅仅因为它可以通过操纵,并不意味着ISDATETRY_CONVERT 足够“聪明”地知道这一点。
  • 事实上,真正的问题似乎是您正在为日期(和时间)值存储文字字符串。
  • @Larnu 非常感谢您的及时回复。是啊,你说得对。 '20210622230000' 的 try_convert 返回 null。 '20210622 23:00:00' 工作正常。我们需要更改 yyyymmddhhmmss 位。无论如何,非常感谢您提供的有用信息:)
  • 不想消极,但如果不是很明显,这就是糟糕的数据库设计。您只有这个问题,因为没有强制执行正确的数据类型(日期时间)。您无法以任何有意义的方式(日期范围等)搜索这些日期,也无法将其编入索引。您也不能在其上使用各种 SQL 日期时间函数(日、年、月、eomonth 等)。对于您能想到的这些日期的任何其他用途,SQL Server 会抛出错误,而不仅仅是这个查询。最好解决将非规范化(甚至不是 1NF)数据放入数据库而不是按原样用于查询的原因。

标签: sql-server datetime datetime-format


【解决方案1】:

只是说您可以使用 STUFF() 减少字符串操作

示例

Declare @S varchar(50)='20210622232715'

Select try_convert(datetime,stuff(stuff(stuff(@S,13,0,':'),11,0,':'),9,0,' '))

结果

2021-06-22 23:27:15.000

【讨论】:

  • 非常感谢,太完美了!!我从来不知道“东西”。我确认它按预期工作 - SELECT CASE WHEN try_convert(datetime,stuff(stuff(stuff('20210622230000',13,0,':'),11,0,':'),9,0,' ')) 为 NULL THEN '1900-01-01 00:00:00' ELSE CONVERT(datetime,stuff(stuff(stuff('20210622230000',13,0,':'),11,0,':') ,9,0,' ')) END AS 结果
猜你喜欢
  • 2012-09-25
  • 2015-01-26
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多