我有以下代码
declare @dt date
set @dt = '7/5/2010 12:00:00 AM '
SELECT CONVERT(DATE, CASE ISDATE(@dt) WHEN 1 THEN @dt ELSE NULL END)
它会抛出错误
参数数据类型日期对于isdate函数的参数1无效。
这是因为变量是date
类型
现在我试过这种方式
declare @dt date
set @dt = '7/5/2010'
SELECT CONVERT(DATE, CASE ISDATE( convert(varchar, @dt ,105) ) WHEN 1 THEN @dt ELSE NULL END)
并且有效。
但是当我把错误的日期放在
之类的时候declare @dt date
set @dt = '7/5/201ss0'
SELECT CONVERT(DATE, CASE ISDATE( convert(varchar, @dt ,105) ) WHEN 1 THEN @dt ELSE NULL END)
错误:
从字符串转换日期和/或时间时转换失败。
我的情况是我有一个巨大的excel文件,我正在通过 c#oled 阅读并执行批量上传的表格类型,所以我不想检查我的C#代码
我如何克服这个问题?
答案 0 :(得分:0)
我建议在CONVERT函数之外移动测试,如下所示:
declare @dt varchar(20)
set @dt = '7/5/2010'
SELECT CASE ISDATE(@dt) WHEN 1 THEN CONVERT(DATE, @dt) ELSE NULL END
答案 1 :(得分:0)
当您尝试创建无效日期时,在分配期间会发生错误。请注意,此处出现相同的错误,但未运行CASE
/ ISDATE
表达式:
declare @dt date
set @dt = '7/5/201ss0'
结果:
Msg 241,Level 16,State 1,Line 2
从字符串转换日期和/或时间时转换失败。
所以,有一些事情:
为什么要尝试将无效字符串分配给日期?
为什么你会使用像7/5/2012这样的模糊日期格式作为日期 - 是7月5日还是5月7日?谁知道? SQL Server知道吗?取决于语言,日期格式,区域设置等。
如果您的参数确实是DATE
参数,则没有理由对ISDATE()
进行测试。除NULL
之外,您无法为DATE
数据类型指定无效日期。