1

2 つの日付間の日数を決定する SQL ステートメントがあります。差が負の場合、ステートメントは 0 を選択する必要があります。このステートメントは機能しますがdatediff("D",GETDATE(),dbo.tblKBX_Reward.validdate)、@ 変数に値を代入できるかどうか疑問に思っていたので、2 回呼び出す必要はありません。

SELECT CASE 
WHEN datediff("D",GETDATE(),dbo.tblKBX_Reward.validdate) < 0  THEN 0
ELSE datediff("D",GETDATE(),dbo.tblKBX_Reward.validdate)
END from ...

コードではなく SQL を使用してこの値を計算している理由を聞かないでください。

ありがとう

4

5 に答える 5

3

このようなより高いレベルのものを書くことができますSELECT

SELECT CASE 
       WHEN diff_date < 0  THEN 0
       ELSE diff_date
       END 
FROM (
     SELECT datediff("D",GETDATE(),dbo.tblKBX_Reward.validdate) AS diff_date
     from ...
     )
于 2012-05-25T18:09:46.030 に答える
3

次のように、case ステートメントを計算内に移動できます。

Select DateDiff("D", GetDate(), Case When YourColumn > GetDate() 
                                     Then YourColumn 
                                     Else GetDate() 
                                     End)
于 2012-05-25T18:18:00.970 に答える
1

複数の行を選択している場合、それを変数に割り当てることはできません。あなたの場合、派生テーブルまたは CTE を使用できます。

SELECT  Cols, 
        CASE 
        WHEN DiffDates < 0  THEN 0
        ELSE DiffDates
        END DiffDates
FROM (  SELECT Cols, datediff("D",GETDATE(),dbo.tblKBX_Reward.validdate) DiffDates
        FROM dbo.tblKBX_Reward) A

または:

;WITH CTE AS
(
    SELECT Cols, datediff("D",GETDATE(),dbo.tblKBX_Reward.validdate) DiffDates
    FROM dbo.tblKBX_Reward
)

SELECT  Cols, 
        CASE 
        WHEN DiffDates < 0  THEN 0
        ELSE DiffDates
        END DiffDates
FROM CTE
于 2012-05-25T18:10:08.963 に答える
1
SELECT
  CASE WHEN daydiff < 0 THEN 0 ELSE daydiff END
FROM your tables/joins
CROSS APPLY (
  SELECT DATEDIFF(DAY, GETDATE(), dbo.tblKBX_Reward.validdate)
) x (daydiff)
WHERE …
于 2012-05-25T18:23:29.143 に答える
0

CTEを使用できます:

WITH cte_dateDiffs (RewardId, dateDiff) 
AS (
   SELECT RewardId, datediff("D",GETDATE(), validdate) FROM dbo.tblKBX_Reward
)
SELECT CASE 
   WHEN dd.dateDiff < 0 THEN 0 
   ELSE dd.dateDiff 
END
FROM dbo.tblKBX_Reward r
INNER JOIN cte_dateDiffs dd ON r.RewardId == dd.RewardId
...
于 2012-05-25T18:14:14.827 に答える