10

私はSQLServerの初心者です。クエリで次のロジックを書くのを手伝ってください。

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

8 に答える 8

8
select *
from table
where DATEDIFF(day, GETDATE(), maildate) = case when
    DATEPART(hour, GETDATE()) >= 16 then 1 else 0
end
于 2012-04-19T23:02:22.970 に答える
3
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
于 2012-04-19T23:01:53.270 に答える
1

ここでの考え方は、含意書き換えルールを使用することです。

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 ) )

次に、2つの式は、連言標準形( "一連の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 ) )  ;
于 2012-04-20T08:55:55.093 に答える
1

正確なMS-syntax-dialectはわかりませんが、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)
     ;   
于 2012-04-19T23:49:42.887 に答える
1

mytableからa.name、if(a.is_active ='t'、'Active'、'Inactive')を選択します。

于 2013-10-22T06:06:23.900 に答える
0

SQLでこれを行うには、ストアドプロシージャが必要です。こちらのドキュメントをご覧くださいhttp://msdn.microsoft.com/en-us/library/aa174792(v=sql.80).aspx

于 2012-04-19T22:58:44.050 に答える
0
IF ( DATEDIFF(h, GETDATE(), DATEADD(h,4,GETDATE()))>0 )

SELECT *
FROM table
WHERE MailDate is Tomorrow

ELSE

SELECT *
FROM table
WHERE MailDate is Today

これはMSSQLです。それ以上のことをしたい場合は、BEGIN....ENDを実行する場合に1つのコマンド/選択を実行します。

于 2012-04-19T23:00:47.163 に答える
0
IF DATEPART(HOUR, GETDATE()) > 16
BEGIN
    -- SELECT statement
END
ELSE 
BEGIN
    -- SELECT statement
END

ストアドプロシージャに含まれている必要はありません。

于 2012-04-19T23:05:16.137 に答える