WHERE子句,其中value是可转换的

时间:2011-08-04 15:23:36

标签: 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                                 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  

6 个答案:

答案 0 :(得分:1)

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

WHERE ISDATE(matl_04_05) = 1

答案 1 :(得分:1)

使用ISDATE

... WHERE ISDATE(mat1_04_05) = 1

答案 2 :(得分:1)

假设我理解你的原始问题......

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

来源:http://msdn.microsoft.com/en-us/library/ms187347.aspx

答案 3 :(得分:1)

Dude - 如果没有控制结构,在WHERE的同一日期字段中使用ISDATE()CONVERT()是没有意义的。即,如果ISDATE() = false,则CONVERT()可以保证为您提供转换错误。

试试这个:

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

答案 4 :(得分:0)

你的意思是

SELECT * FROM FOO where ISDATE(mat1_04_05)

答案 5 :(得分:0)

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