TRY_CONVERT在看起来像日期的值上返回NULL

时间:2019-03-17 12:54:10

标签: sql-server tsql date type-conversion

由于a reply from my last question,我一直受益于componentDidMount功能。

我现在正面临着键/值表(类型为TRY_CONVERT的值列)中的一个值,即使它看起来很像日期,也无法转换为NVARCHAR(50)

enter image description here

我想为什么DATE返回TRY_CONVERT(DATE, [Claim issue complete])

即使我使用像这样的值的子字符串,结果也一样

NULL

更新:图片的文本副本

SELECT SUBSTRING([Claim issue complete], 1, 10) AS CompletionDate

更新2 :示例

这是问题的一个示例。

Claim issue complete
2018-09-21 00:00:00+02
2017-10-12 00:00:00+02
2018-01-30 00:00:00+01
2017-07-19 00:00:00+02
2019-02-14 00:00:00+01
NULL
2017-08-06 00:00:00+02
2017-10-04 00:00:00+02
2018-05-18 00:00:00+02
2018-09-05 00:00:00+02
2019-01-14 00:00:00+01
2019-01-24 00:00:00+01
2018-03-21 00:00:00+01
2017-11-28 00:00:00+01
2018-02-26 00:00:00+01
2018-04-05 00:00:00+02
2018-04-27 00:00:00+02

以上返回SELECT TRY_CONVERT(DATE, '2018-09-21 00:00:00+02')

3 个答案:

答案 0 :(得分:1)

理想情况下,您应该更改数据库结构,并将值存储在适当的数据类型中-如果需要日期值,请将其存储为Date,如果需要时,将其存储为DateTime2Why not DateTime?),并且如果需要时区感知,请将其存储为DateTimeOffset
有关更多信息,请阅读亚伦·贝特朗(Aaron Bertrand)的Bad habits to kick : choosing the wrong data type

您在数据库中使用的字符串表示形式格式不适合SQL Server中的任何built in date time styles-这就是Try_Convert失败的原因(就此而言,Try_Cast也会失败) 。
如果您只对值的日期部分感兴趣,则可以对最左边的10个字符使用try_cast-因为您要转换为Date,而不是DateTime yyyy-mm -dd格式是明确的,并且将始终正确转换:

SELECT  TRY_CAST(LEFT('2018-09-21 00:00:00+02', 10) As DATE)

如果要改用Try_convert,则需要指定style参数-在这种情况下为120:

SELECT  TRY_CONVERT(DATE, LEFT('2018-09-21 00:00:00+02', 10), 120)

请注意,您不需要任何代码即可处理null输入-它们将以null的形式出现

答案 1 :(得分:0)

SELECT TRY_CONVERT(DATE, '2018-09-21 00:00:00+02')不起作用的原因是它不是有效的日期格式。具体来说,它是最后的+02部分。
如果您知道前19个位置始终为YYYY-MM-DD hh:mm:ss,则可以这样重写:

SELECT TRY_CONVERT(DATE, LEFT('2018-09-21 00:00:00+02', 19))

我刚刚添加了LEFT函数以最终整理出+02

答案 2 :(得分:0)

美好的一天,

SELECT TRY_CONVERT(DATETIME2 , '2018-09-21 00:00:00 +02', 20) -- null, since this '+02' is not a legit OFFSET
SELECT TRY_CONVERT(DATETIME2 , '2018-09-21 00:00:00 +02:00', 20) -- OK
--Solution for bad OFFSET style can be to add the missing string:
SELECT TRY_CONVERT(DATETIME2 , '2018-09-21 00:00:00 +02' + ':00', 20) -- OK

--Same using Date:
SELECT TRY_CONVERT(DATE , '2018-09-21 00:00:00 +02' + ':00', 20) -- OK