Итак, я понимаю, что проблема в этой части:
CASE WHEN CONVERT(DATETIME, CONVERT(VARCHAR(20),OpeningDate,106) + ' ' + CONVERT(VARCHAR(20),OpeningTime,108))< GETDATE() THEN 1 ELSE 0 END AS OpeningVaild
Обновление
Так как я впервые опубликовал свой ответ,Оказывается, вы сохраняете дату открытия как varchar
вместо date
.
Во-первых, вам следует прекратить это делать.Никогда не храните даты ни в каком другом столбце, кроме Date
(если только они вам не нужны со временем, а затем используйте DateTime2
).Для получения дополнительной информации прочитайте Плохие привычки Аарона Бертранда: выбор неправильного типа данных.
Предполагая, что тип данных столбца не может измениться, вы написали в комментариях к вопросу:
@ ZoharPeled: это формат даты открытия 2017-04-10
Иллюстрирование одной из проблем, вызванных сохранением дат в виде строк - Как я могу, иликто-нибудь еще по этому вопросу, знаете, это 10 апреля или 4 октября?Ответ - мы не можем.
Итак, если предположить, что это 10 апреля, вы можете преобразовать его в DateTime
, используя преобразование с 126 в качестве параметра стиля:
CASE
WHEN CONVERT(DateTime, OpeningDate, 126) + CAST(OpeningTime As DateTime) < GETDATE() THEN
1
ELSE
0
END As OpeningVaild
Firstверсия:
Предполагая, что тип данных OpeningDate
равен Date
, а тип данных OpeningTime
равен Time
. Похоже, вы пытаетесь выяснить, является ли комбинация этих столбцов в DateTime
перед текущим DateTime
.
Вместо преобразования их в строки и обратно в DateTime
, вы можете привести оба к DateTime
и просто сложить их вместе:
CASE
WHEN CAST(OpeningDate As DateTime) + CAST(OpeningTime As DateTime) < GETDATE() THEN
1
ELSE
0
END As OpeningVaild
Другой вариант - использовать GETDATE()
дважды.Я не думаю, что это должно иметь значение в предложении select
, но в предложении where
важно использовать эту опцию, так как первый сделает эти столбцы недоступными для поиска, то есть ядро базы данных не сможет использоватьлюбые индексы, которые могут помочь плану выполнения оператора:
CASE
WHEN OpeningDate < CAST(GETDATE() AS DATE)
OR
(
OpeningDate = CAST(GETDATE() AS DATE)
AND OpeningTime <= CAST(GETDATE() AS TIME)
) THEN
1
ELSE
0
END AS OpeningVaild
При этом ваш запрос также имеет CONVERT(VARCHAR,OpeningDate,106)
- стиль 106 возвращает строковое представление даты в виде dd mon yyyy
- значение 11chars - так что измените это на CONVERT(CHAR(11),OpeningDate,106)
Обратите внимание, что использование varchar
без указания длины по умолчанию равно 30, что не является проблемой в этом случае, так как это больше, чем вам нужно 11 символов, но это плохая привычкане указывайте длину, и вы должны пнуть его.