Условие IF в запросе SQL

Я новичок в SQL Server. Пожалуйста, помогите мне написать следующую логику в запросе.

<code>If getnow() > today 4 PM
Then
    SELECT *
    FROM table
    WHERE MailDate is Tomorrow
Else
    SELECT *
    FROM table
    WHERE MailDate is Today
</code>

Ответы на вопрос(8)

если (a.is_active = "t", "Active", "Inactive") из mytable a

но я попытаюсь доказать, что вам не нужна конструкция IF или CASE. Я взял ответ @mellamokb в качестве примера.

SELECT *
  FROM the_table
 WHERE ( DATEPART(hour, GETDATE()) >= 16
           AND DATEDIFF(day, GETDATE(), MailDate) = 1)
    OR (DATEPART(hour, GETDATE()) < 16
           AND DATEDIFF(day, GETDATE(), MailDate) = 0)
     ;   
 22 апр. 2012 г., 02:07
За исключением того, что ваш & quot;quest to avoid a case when/else& Quot; приводит кwhere clause что для каждой записи нужно сделать несколько оценок, тогда как мойcase when... может быть оценен один раз, а затем требуется только одна оценка для каждой записи.
Решение Вопроса
select *
from table
where DATEDIFF(day, GETDATE(), maildate) = case when
    DATEPART(hour, GETDATE()) >= 16 then 1 else 0
end
 user134526020 апр. 2012 г., 02:10
Робллл, я проголосовал за тебя, и если тебе от этого станет легче, я бы хотел сказать, что я реализовал твой код, так как он выглядел намного эффективнее. Конечно, мне понадобилось время, чтобы понять это. :) Большое спасибо
 20 апр. 2012 г., 02:08
Привет, RobIII, приятель. Просто хотел сказать, что я проголосовал против вас, но отрицательные отзывы могут быть результатом разговоров в этом посте. Не принимайте это на свой счет, мы все всегда можем чему-то научиться :) Просто не забудьте подумать о том, что вы говорите, когда вы публикуете это, и подумайте, как это может встретиться с другими. Я и другие люди изо всех сил стараемся сделать СО дружелюбным сообществом, которое приветствует все уровни квалификации и дает всем шанс. Похоже, ваш ответ был помечен как ответ, поэтому поздравляю вас и желаем вам удачного дня!
IF DATEPART(HOUR, GETDATE()) > 16
BEGIN
    -- SELECT statement
END
ELSE 
BEGIN
    -- SELECT statement
END

 20 апр. 2012 г., 01:10
Комментировать чужой ответ и продвигать свой собственный не очень полезно или ориентировано на сообщество. Пожалуйста, воздержитесь от этого в будущем.
 20 апр. 2012 г., 14:39
Очень смешно, дикий человек. И спасибо, @mellamokb.

чтобы использовать правило перезаписи импликации:

IF ( x ) THEN ( y )   is equivalent to  ( NOT ( x ) OR y )

В твоем случае

IF ( DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16 ) 
   THEN ( DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1 ) 

эквивалентно

( NOT ( DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16 ) 
   OR ( DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1 ) ) 

и само по себе эквивалентно

( ( DATEPART(HOUR, CURRENT_TIMESTAMP) < 16 ) 
   OR ( DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1 ) )

Переписываю оригиналELSE пункт какIF..THEN Заявление само по себе:

IF ( DATEPART(HOUR, CURRENT_TIMESTAMP) < 16 ) 
   THEN ( DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0 ) 

эквивалентно (на этот раз без промежуточного шага)

( ( DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16 )
   OR ( DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0 ) )

Затем два выражения могут быть записаны в конъюнктивной нормальной форме ("серияANDs)

SELECT *
  FROM the_table
 WHERE ( ( DATEPART(HOUR, CURRENT_TIMESTAMP) < 16 ) 
          OR ( DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1 ) ) 
       AND 
       ( ( (DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16
          OR ( DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0 ) )  ;
IF datepart(hh, getdate()) >= 16
    BEGIN
        SELECT *
        FROM table
        WHERE DateDiff(day, getdate(), MailDate) = 1
    END
ELSE
    BEGIN
        SELECT *
        FROM table
        WHERE DateDiff(day, getdate(), MailDate) = 0
    END
 20 апр. 2012 г., 02:02
@mellamokb спасибо за то, что указали на & gt; =, очевидно, я пропустил это. Я не понял, что они были одинаковыми после моего первоначального редактирования. Я чувствовал, как бьется в ударе новообращенных. Я знаю, что они не лучшие, чтобы конвертировать туда и обратно, я просто показываю другой, хотя и некрасивый путь. :)
 20 апр. 2012 г., 01:16
@RobIII вы правы, это исправлено. Я просто предоставлял другой способ сделать это, но я не сказал, что это был лучший способ.
 20 апр. 2012 г., 01:14
Почему уродливый бросок туда-сюда (с помощью "магии"style-constant& Quot; (например.101) коды, которые никто никогда не сможет вспомнить, varchars, значение времени в строке, включая пробел, который, если он будет забыт, сломает все и т. д.) если есть функции datetime?
 20 апр. 2012 г., 01:56
Я удалил свой ответ, поскольку теперь он практически одинаков. Но я выложу демо здесь:sqlfiddle.com/#!3/96767/1, Обратите внимание, что вы хотите>= 16 в противном случае вы начинаете в 17:00.
IF ( DATEDIFF(h, GETDATE(), DATEADD(h,4,GETDATE()))>0 )

SELECT *
FROM table
WHERE MailDate is Tomorrow

ELSE

SELECT *
FROM table
WHERE MailDate is Today

чем просто одна команда / выберите внутри, если вы делаете BEGIN .... END.

 20 апр. 2012 г., 01:48
@RobIII Я только что скопировал два утверждения, не видел этого. Во всяком случае, он может простое то же самое, что я написал в предложении if, это то же самое
 20 апр. 2012 г., 01:09
С каких пор MSSQL поддерживаетWHERE MailDate is Tomorrow или жеWHERE MailDate is Today? Так жеis Оператор предназначен для сравнения сnull, ничего больше.

чтобы сделать это в SQL. Посмотрите документы здесьhttp://msdn.microsoft.com/en-us/library/aa174792(v=sql.80).aspx

Ваш ответ на вопрос