ГДЕ предложение, где значение является конвертируемым - PullRequest
1 голос
/ 04 августа 2011

Есть ли способ в SQL Server, используя T-SQL, сказать:

WHERE CONVERT(date, mat1_04_05, 101) = true

Я делаю некоторые отчеты по приложению, для которого у меня нет источника, а столбец - varchar, и я не могу полагаться на данные пользователя.

EDIT

Я пытался использовать 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 ]

1 голос
/ 04 августа 2011

Чувак - не имеет смысла использовать ISDATE() и CONVERT() в одном и том же поле даты в вашем WHERE без управляющей структуры.То есть, если ISDATE() = false, то CONVERT() гарантированно выдаст вам ошибку преобразования.

Попробуйте:

WHERE
...
CASE WHEN ISDATE(myDateField) = 1 THEN DATEDIFF(CONVERT(...)) ELSE 0 END > 31
1 голос
/ 04 августа 2011

Предполагая, что я понял ваш исходный вопрос ...

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

источник: http://msdn.microsoft.com/en-us/library/ms187347.aspx

1 голос
/ 04 августа 2011

Использование ISDATE.

... WHERE ISDATE(mat1_04_05) = 1
1 голос
/ 04 августа 2011

Вы имеете в виду проверить, является ли этот столбец датой?

WHERE ISDATE(matl_04_05) = 1
0 голосов
/ 04 августа 2011

Для 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
0 голосов
/ 04 августа 2011

Вы имеете в виду что-то вроде

SELECT * FROM FOO where ISDATE(mat1_04_05)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...