我的数据库表中有一个varchar
列,在我想返回的行上填充为'2018-12-26T00:00:00.000
'(引号是我的,不包括在实际值中)。每当我尝试在有效日期(例如
SELECT
myValue
FROM
myTable
WHERE
ISDATE(myValue) = 1
它正确返回。但是,我需要将此值转换为DATE
。当我尝试这样的事情时:
SELECT
CAST(myValue AS DATE) AS myValueFormatted
FROM
myTable
WHERE
ISDATE(myValue) = 1
我收到错误
从字符串转换日期和/或时间时转换失败
我还有其他方法可以将此varchar
值转换为Date
吗?
更新:通过一些不同的尝试,我注意到,使用该值作为任何日期(DATEDIFF
,CONVERT
返回字符串等)的日期,查询对我来说似乎很好。在select部分中,但是尝试在WHERE
子句中执行任何操作都会导致错误。为了确保没有其他干扰,我创建了一个临时表,其中只有1行具有上面的数据值,并且仅针对该值运行查询会给出错误
更新2:好的,我不知道为什么要修复它,但这就是我所发现的。当我跑步时
SELECT
myValue
FROM
myTable
WHERE
TRY_CONVERT(DATE, myValue) IS NOT NULL
它返回的值与
完全相同SELECT
myValue
FROM
myTable
WHERE
ISDATE(myValue) = 1
但是,当我随后将AND CAST(myValue AS DATE) < GETDATE()
添加到每个WHERE
子句时,只有第一个起作用。我知道为什么TRY_CONVERT使用起来更安全,但我仍然不确定为什么它可以在GETDATE()上使用
答案 0 :(得分:2)
我无法重现您的错误...
declare @dt varchar(256) = '2018-12-26T00:00:00.000'
select cast(@dt as date)
因此,那里必须有另一个无法转换的无赖值。
要确定导致什么原因导致版本<2012上的问题,请运行以下命令:
SELECT
myValue
FROM myTable
WHERE
ISDATE(myValue) = 0
请注意,ISDATE
仅在与CONVERT
函数一起使用,指定了CONVERT
样式参数且样式不等于0、100、9时才具有确定性。或109。
从2012年开始,使用TRY_CONVERT
SELECT
*
FROM myTable
WHERE
TRY_CONVERT(date, myValue) IS NULL
答案 1 :(得分:0)
您也可以尝试以下操作:
SELECT CAST(LEFT(MyValue, 10) AS DATE)
如果仍然无法使用,则说明您的数据存在一些格式化问题。
答案 2 :(得分:0)
这对我有帮助....
将字符串转换为 varchar(30) 然后将 varchar 转换为 datetime2
CAST(CAST(REPLACE(['Timestamp' ],'''','') AS varchar(30)) as datetime2)