Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TRY\u CONVERT在看起来像日期的值上返回NULL_Sql Server_Tsql_Date_Type Conversion - Fatal编程技术网

Sql server TRY\u CONVERT在看起来像日期的值上返回NULL

Sql server TRY\u CONVERT在看起来像日期的值上返回NULL,sql-server,tsql,date,type-conversion,Sql Server,Tsql,Date,Type Conversion,我一直受益于TRY_CONVERT函数 我现在面对的是键/值表中的一个值,即NVARCHAR50类型的值列,它无法转换为日期,即使它看起来很像日期 我想知道为什么TRY_CONVERTDATE,[Claim issue complete]应该返回空值 即使我使用这样的值的子字符串,结果也是一样的 SELECT SUBSTRING([Claim issue complete], 1, 10) AS CompletionDate 更新:图片的文本副本 Claim issue complete 20

我一直受益于TRY_CONVERT函数

我现在面对的是键/值表中的一个值,即NVARCHAR50类型的值列,它无法转换为日期,即使它看起来很像日期

我想知道为什么TRY_CONVERTDATE,[Claim issue complete]应该返回空值

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

SELECT SUBSTRING([Claim issue complete], 1, 10) AS CompletionDate
更新:图片的文本副本

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
更新2:一个例子

下面是问题的一个例子

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

上面的返回值为空。

理想情况下,您应该更改数据库结构并将值存储在适当的数据类型中-如果需要日期值,请将其存储为;如果需要与时间一起存储,请将其存储为;如果需要时区感知,请将其存储为。 更多信息,请阅读亚伦·伯特兰的

您在数据库中使用的字符串表示格式不适合SQL Server中的任何一种格式-这就是为什么Try_转换失败的原因,因为Try_转换会失败。 如果您只对值的日期部分感兴趣,可以在最左边的10个字符上使用try_cast-因为您是按日期而不是日期时间进行转换,yyyy-mm-dd格式是明确的,并且将始终正确转换:

SELECT  TRY_CAST(LEFT('2018-09-21 00:00:00+02', 10) As DATE)
如果要改为使用Try_convert,则需要在本例中指定样式参数-120:

SELECT  TRY_CONVERT(DATE, LEFT('2018-09-21 00:00:00+02', 10), 120)
请注意,您不需要任何代码来处理空输入-它们将显示为空

选择TRY\u CONVERTDATE,'2018-09-21 00:00:00+02'的原因是它不是有效的日期格式。具体来说,它是最后的+02部分。 如果您知道前19个位置总是YYYY-MM-DD hh:MM:ss,您可以这样重新编写:

我刚刚添加了LEFT函数来整理最后的+02

Good day

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

是转换失败的特定值,还是全部/部分转换失败?你能用DDL+DML为样本数据创建一个值,这样我们就可以重现这个问题吗?@ZoharPeled图片中的值都为TRY_CONVERTDATE返回空值,[Claim issue complete]。尽管它看起来很像一个日期!!发布有问题的值。仅仅因为某些内容看起来像日期,并不意味着SQL Server将始终转换它。例如,TRY_CONVERTdatetime、'2019-03-17'和TRY_CONVERTdate、'03/17/2019'在我的实例上都将返回NULL。无论数据类型和语言如何,只有两种格式可以保证正确的转换;它们是yyyyMMdd和yyyy MM dd Thh:MM:ss.SSSSS。实际上,这里没有返回NULL的值;因此,我们只能告诉您日期字符串无效。但是您使用的是子字符串,它确实有效。
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