#sql
#sql
Вопрос:
Я пытаюсь использовать приведенное ниже условие if в SLQ, чтобы возвращать определенное значение каждый день с 07:25 вечера до 8:35 утра, но это условие иногда не выполняется и не дает ожидаемого результата. при наблюдении заметил несколько случаев, когда время сервера находится между 00:00: 00 часов 00:24:00 часов. Может кто-нибудь помочь с любым альтернативным вариантом? Я использую это условие в табличной функции
If (CONVERT(VARCHAR(20),GETDATE(),108)>'19:25:00') and (CONVERT(VARCHAR(20),GETDATE(),108)<'8:35:00')
Begin
Return @string
End
Комментарии:
1. Какую СУБД вы используете? (Этот код очень специфичен для продукта.)
2. Сравнение значений времени в виде строк кажется потенциально проблематичным.
9:30:00
сравнивает как большее, чем20:00:00
, из-за первого символа. Как правило, предпочитают соответствующие типы данных.3. «это условие иногда не выполняется и не дает ожидаемого результата» — когда и с каким неправильным результатом? В любом случае, вы обрабатываете временные метки как строки, что очень неправильно, потому что вы получите буквальную сортировку по символам, а не ту, которая знает, какое время раньше / позже, чем в другие времена. Поэтому вы должны сравнивать их как раз.
4. В этом случае будет ли работать приведенная ниже опция Declare @date time=getdate() If (@date>’22:15:00′ или @date<’09:00:00′) Begin Return End
5. Вероятно, нет, потому что сравнение значения даты / времени со строкой. Кроме того, getDate(), вероятно, возвращает компонент даты, а не время. Любое сравнение значений даты / времени должно иметь дело с компонентом даты, а также со временем. Для сравнения строк включите нулевой заполнитель: 09:30:00 будет сортироваться до 20:00:00.