由于a reply from my last question,我一直受益于componentDidMount
功能。
我现在正面临着键/值表(类型为TRY_CONVERT
的值列)中的一个值,即使它看起来很像日期,也无法转换为NVARCHAR(50)
。
我想为什么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')
。
答案 0 :(得分:1)
理想情况下,您应该更改数据库结构,并将值存储在适当的数据类型中-如果需要日期值,请将其存储为Date
,如果需要时,将其存储为DateTime2
(Why 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