SQL Server 2012: сравнивать и вычитать даты в соединении - PullRequest
0 голосов
/ 02 июля 2018

Я хочу получить результаты этого запроса на присоединение за последние 30 дней.

V.[4501001] содержит даты nvarchar в этом формате dd/mm/yyyy

Вот мой запрос:

(select Distinct T.PId from [dbo].[TrialStatus] T inner join 
    form.TP_VISDATE V on T.pid = V.pid
    where T.cid = 1064 and T.sid = 300 and (Convert(NVARCHAR, V.[4501001], 103) < Convert(NVARCHAR,GETDATE(),103)) and (Convert(NVARCHAR, V.[4501001], 103) > DATEADD(DD,-30,Convert(NVARCHAR,GETDATE(),103))))

Если я использую Convert(NVARCHAR,GETDATE(),103), я получаю ложные результаты, потому что это

select DATEADD(Day,-30,Convert(NVARCHAR,GETDATE(),103))

возвращает 2018-01-08 00:00:00.000 вместо дня за 30 дней до сегодняшнего дня

Но если я использую GETDATE() без преобразования, я получаю эту ошибку:

Преобразование типа данных nvarchar в тип данных datetime привело к значению вне допустимого диапазона.

1 Ответ

0 голосов
/ 02 июля 2018

Преобразуйте значение в дату, а не в строку!

select Distinct T.PId
from [dbo].[TrialStatus] T inner join 
     form.TP_VISDATE V 
     on T.pid = V.pid
where T.cid = 1064 and
      T.sid = 300 and
      Convert(date, V.[4501001], 103) < Convert(date, GETDATE()) and
      Convert(date, V.[4501001], 103) > DATEADD(day, -30, Convert(date, GETDATE()));

Затем вы можете исправить данные в вашей таблице. Не храните даты в виде строк. Храните их, используя нативные типы.

...