【问题标题】:SQL inline variable assignmentSQL 内联变量赋值
【发布时间】:2012-05-25 18:05:24
【问题描述】:

我有一个 SQL 语句来确定两个日期之间的天数。如果差值为负,则该语句需要选择 0。该语句有效,但我想知道是否可以将 datediff("D",GETDATE(),dbo.tblKBX_Reward.validdate) 的值分配给 @ 变量,这样我就不必调用它两次。

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

请不要问我为什么要使用 SQL 而不是代码来计算这个值。

谢谢

【问题讨论】:

    标签: sql tsql variables


    【解决方案1】:

    您可以在计算中移动 case 语句,如下所示:

    Select DateDiff("D", GetDate(), Case When YourColumn > GetDate() 
                                         Then YourColumn 
                                         Else GetDate() 
                                         End)
    

    【讨论】:

      【解决方案2】:

      你可以像这样写一个更高级别的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 ...
           )
      

      【讨论】:

        【解决方案3】:

        如果您选择多行,则不能将其分配给变量。在您的情况下,您可以使用派生表或 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
        

        【讨论】:

          【解决方案4】:
          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 …
          

          【讨论】:

            【解决方案5】:

            您可以使用 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
            ...
            

            【讨论】:

              猜你喜欢
              • 2014-02-26
              • 2012-09-03
              • 2015-07-22
              • 2018-12-26
              • 2016-11-21
              • 1970-01-01
              • 2018-07-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多