Условие IF в SQL-запросе
Я новичок в SQL Server. Пожалуйста, помогите мне написать следующую логику в запросах.
If getnow() > today 4 PM
Then
SELECT *
FROM table
WHERE MailDate is Tomorrow
Else
SELECT *
FROM table
WHERE MailDate is Today
8 ответов
select *
from table
where DATEDIFF(day, GETDATE(), maildate) = case when
DATEPART(hour, GETDATE()) >= 16 then 1 else 0
end
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
Я не знаю точного MS-синтаксиса-диалекта, но я попытаюсь доказать, что вам не нужна конструкция 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)
;
идея здесь состоит в том, чтобы использовать правило перезаписи импликации:
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 ) )
затем два выражения могут быть записаны в конъюнктиве нормальная форма ("серия AND
s)
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 ) ) ;
для этого требуется хранимая процедура в SQL. Взгляните на документы здесь http://msdn.microsoft.com/en-us/library/aa174792 (v=sql.80).aspx
IF ( DATEDIFF(h, GETDATE(), DATEADD(h,4,GETDATE()))>0 )
SELECT *
FROM table
WHERE MailDate is Tomorrow
ELSE
SELECT *
FROM table
WHERE MailDate is Today
Это MS SQL. Если вы хотите сделать больше, то только одну команду / выберите внутри, если вы начнете .... КОНЕЦ.
IF DATEPART(HOUR, GETDATE()) > 16
BEGIN
-- SELECT statement
END
ELSE
BEGIN
-- SELECT statement
END
это не обязательно должно быть в хранимой процедуре.