IsDate()在sql server中带有datetype变量

时间:2013-11-21 05:27:04

标签: c# sql sql-server

我有以下代码

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#代码

我如何克服这个问题?

2 个答案:

答案 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   
从字符串转换日期和/或时间时转换失败。

所以,有一些事情:

  1. 为什么要尝试将无效字符串分配给日期?

  2. 为什么你会使用像7/5/2012这样的模糊日期格式作为日期 - 是7月5日还是5月7日?谁知道? SQL Server知道吗?取决于语言,日期格式,区域设置等。

  3. 如果您的参数确实是DATE参数,则没有理由对ISDATE()进行测试。除NULL之外,您无法为DATE数据类型指定无效日期。