2013-12-20 3 views
0

У меня есть таблица, где даты хранятся в виде текста, потому что это поле также может хранить что-то еще.two date comparisn дает Conversion не удалось при преобразовании даты и/или времени из символьной строки

Мне нужно вывести строки с датой в этом поле, и эта дата должна быть в пределах + 2 месяцев.

Мой запрос:

;WITH sel AS (SELECT t1.ItemUserID, t3.Omschrijving AS Hoofditem, 
       t4.Omschrijving AS Subitem, t2.Omschrijving AS SubItemonderdeel, 
       CONVERT(DATE,t1.subitemwaarde) AS subitemwaarde, 
       CONVERT(DATE,DATEADD(month, 2, CONVERT(DATE,GETDATE(),101))) as now_plus_2 
      FROM MainDataTable AS t1 
      LEFT JOIN SubItemsOnderdelen AS t2 ON t1.SubItemonderdeel=t2.Code 
      LEFT JOIN HoofdItemOnderdelen AS t3 ON t1.Hoofditem = t3.Code 
      LEFT JOIN ItemData AS t4 ON t1.subitem=t4.itemcode 
      WHERE t2.Omschrijving LIKE 'expires on' 
       and ISDATE(t1.SubItemWaarde) = 1) 

SELECT * FROM sel AS t2 

Если я запускаю это, я получаю таблицу со всеми данными, последние два столбца показывают даты и даты столбцов.

Когда я добавляю ГДЕ t2.subitemwaarde < t2.now_plus_2 к последнему ЗЕЬЕСТУ, я получаю ошибку:

«Конверсия удалась при преобразовании даты и/или времени из символьной строки»

Зачем? Что я делаю не так?

rg. Eric

ответ

4

Исключите не-даты в пункте JOIN сам до фильтрации с WHERE

ON t1.SubItemonderdeel=t2.Code and ISDATE(t1.SubItemWaarde) = 1) 

Вы должны также рассмотреть вопрос о добавлении набора столбцов, соответствующих типу данных.

+0

Это сделало трюк. Благодаря! – Eric

1

t2.subitemwaarde< t2.now_plus_2 сравнивает String с Date. Преобразование t2.subitemwaarde к дате, прежде чем сравнивать, чтобы решить эту проблему:

CONVERT(DATE,t2.subitemwaarde) < t2.now_plus_2 

Это может привести к ошибкам, если t2.subitemwaarde не дата, так что вам может понадобиться добавить фильтр ISDATE(t2.subitemwaarde) = 1.

+0

он сказал, что он также хранит «что-то еще» ... разве вы не думаете, что он столкнется с точно такими же проблемами? – Leo

+0

Не применяется предикат AND ISDATE (t1.SubItemWaarde) = 1. –

+0

Согласен ... Я просто не видел этого в вашем ответе – Leo

1

Попробуйте это,

Я думаю, вы должны использоваться ниже формате. Потому что я не знаю, какой формат даты вы должны преобразовать.

select CONVERT(Datetime,'20/12/2012 12:12:00.000',103) 
+0

Что произойдет, если это не дата? – Leo

+0

, если заданный формат - дата, тогда его конвертировать в противном случае реализует другую логику. –

1

Я не совсем понимаю, какое поле вы сравниваете как дату, но попробовать что-то вроде этого:

WHERE CASE WHEN ISDATE(t2.SubItemWaarde) = 1) 
    THEN CONVERT(DATE, t2.subitemwaarde) < t2.now_plus_2 
    ELSE 1=0 
    END 

В основном дело заявление, чтобы проверить, если поле даты, а затем состояние, else 1 = 0, который всегда неверен, поэтому строка будет оставлена ​​

Смежные вопросы

 Смежные вопросы