Sql WHERE条款,其中价值是可转换的

Sql WHERE条款,其中价值是可转换的,sql,sql-server,tsql,date,type-conversion,Sql,Sql Server,Tsql,Date,Type Conversion,在SQL Server中是否有一种方法可以使用T-SQL来表示: WHERE CONVERT(date, mat1_04_05, 101) = true 我正在对一个没有源代码的应用程序做一些报告,该列是varchar,我不能依赖用户数据 编辑 我尝试使用ISDATE。但是,我仍然遇到转换错误这是完整的查询: SELECT mat1_04_01 AS 'CaseStg', matter.mat_no

SQL Server
中是否有一种方法可以使用
T-SQL
来表示:

WHERE CONVERT(date, mat1_04_05, 101) = true
我正在对一个没有源代码的应用程序做一些报告,该列是
varchar
,我不能依赖用户数据

编辑

我尝试使用
ISDATE
。但是,我仍然遇到转换错误这是完整的查询:

SELECT mat1_04_01                                    AS 'CaseStg',
       matter.mat_no                                 AS 'MatNo',
       MAX(matter.client)                            AS 'Client',
       MAX(mat1_03_01)                               AS 'InCo',
       MAX(mat1_07_01)                               AS 'Clm Amt',
       MAX(mat1_07_03)                               AS 'Clm Bal',
       MAX(mat1_04_05)                               AS 'BilSnt',
       MAX(mat1_01_07)                               AS 'Injured',
       CONVERT(CHAR, MIN(CONVERT(DATE, usr1_02_01))) AS dos_start,
       CONVERT(CHAR, MAX(CONVERT(DATE, usr1_02_02))) AS dos_end
FROM   lntmuser.matter
       INNER JOIN lntmuser.usertype1
         ON lntmuser.matter.sysid = lntmuser.usertype1.mat_id
WHERE  Isdate(mat1_04_05) = 1
       AND Datediff(DAY, CONVERT(DATE, mat1_04_05, 101), Getdate()) > 31
       AND mat1_04_01 LIKE 'BILLING MAILED OUT'
       AND matter.status NOT LIKE 'CLOSED'
GROUP  BY mat1_04_01,
          matter.mat_no  

你的意思是检查该列是否为日期

WHERE ISDATE(matl_04_05) = 1

你的意思是检查该列是否为日期

WHERE ISDATE(matl_04_05) = 1

你是说像这样的东西吗

SELECT * FROM FOO where ISDATE(mat1_04_05)

你是说像这样的东西吗

SELECT * FROM FOO where ISDATE(mat1_04_05)
使用

使用


对于
datetime
您可以

;with T(F) as (
    select 'cake' union
    select '01 mar 2011'
)
select cast(f as datetime) from T where isdate(F) = 1

>>F
>>2011-03-01 00:00:00.000

对于
datetime
您可以

;with T(F) as (
    select 'cake' union
    select '01 mar 2011'
)
select cast(f as datetime) from T where isdate(F) = 1

>>F
>>2011-03-01 00:00:00.000

假设我理解你最初的问题

IF ISDATE('2009-05-12 10:19:41.177') = 1
    PRINT 'VALID'
ELSE
    PRINT 'INVALID'

来源:

假设我理解了你最初的问题

IF ISDATE('2009-05-12 10:19:41.177') = 1
    PRINT 'VALID'
ELSE
    PRINT 'INVALID'
来源:

Dude——在没有控制结构的WHERE中的同一日期字段上使用
ISDATE()
CONVERT()
是没有意义的。也就是说,如果
ISDATE()
=false,那么
CONVERT()
保证会给您一个转换错误

试试这个:

WHERE
...
CASE WHEN ISDATE(myDateField) = 1 THEN DATEDIFF(CONVERT(...)) ELSE 0 END > 31
Dude——在没有控件结构的WHERE中的同一日期字段上使用
ISDATE()
CONVERT()
是没有意义的。也就是说,如果
ISDATE()
=false,那么
CONVERT()
保证会给您一个转换错误

试试这个:

WHERE
...
CASE WHEN ISDATE(myDateField) = 1 THEN DATEDIFF(CONVERT(...)) ELSE 0 END > 31

你说的“真”是什么意思?你是在检查它是否以某种格式存在,还是在检查它是否存在?我正在尝试运行一个报告,忽略/找到阻止fluck up的数据条目,而开发者没有处理lol。@Adrain谢谢你,我只是在试图纠正这个错误--使用ISDATE()和CONVERT()是没有意义的在没有控制结构的同一日期字段上…请参见下面我的答案。您所说的“真”是什么意思?你是在检查它是否以某种格式存在,还是在检查它是否存在?我正在尝试运行一个报告,忽略/找到阻止fluck up的数据条目,而开发者没有处理lol。@Adrain谢谢你,我只是在试图纠正这个错误--使用ISDATE()和CONVERT()是没有意义的在没有控制结构的同一日期字段上…请参见下面的答案。