将值存储在 select 作为临时变量并重用它们

Yam*_*088 4 sql-server-2008 sql-server

我正在尝试清理一个丑陋但可以完成工作的查询。我想知道是否可以在 SELECT 语句中创建一个临时变量。我已经谷歌搜索并没有找到任何帮助。基本上我对查询所做的是将 DateTime 字段与当前时间进行比较,以查看日期是过去还是将来。也许我把一些简单的事情复杂化了,但是从互联网上环顾四周,这似乎是比较 DateTime 字段的唯一方法。

我希望能够重用查询的以下重复部分,因为我必须将它们列出两次才能获得下限值:

(CAST(DATEADD(n, bq.markupDelay, sr.lastviewed) AS FLOAT)
Run Code Online (Sandbox Code Playgroud)

(CAST(GETDATE() AS FLOAT)
Run Code Online (Sandbox Code Playgroud)

这是查询:

    SELECT
          bq.quoteID
        , bq.unsentNumber
        , bq.sendSubsequent
        , bq.unsentDelay
        , sr.contractorID
        , CASE 
            WHEN (CAST(DATEADD(n, bq.markupDelay, sr.lastviewed) AS FLOAT)  - FLOOR(CAST(DATEADD(n, bq.markupDelay, sr.lastviewed) AS FLOAT))) <= (CAST(GETDATE() AS FLOAT) - FLOOR(CAST(GETDATE() AS FLOAT))) 
                THEN 1
                ELSE 0
            END AS 'Add Bid'
        , DATEADD(n, bq.markupDelay, sr.lastviewed) AS 'Send Time'
        , GETDATE() AS 'Time Now'  
        , e.email
        , e.name
    FROM tblCustomerBidQueue bq
    INNER JOIN tblServiceRecords sr ON bq.QuoteID = sr.cartID AND sr.status = 'Bid' AND bq.status = 'Queued'
    INNER JOIN tblContractors c ON c.ID = sr.contractorID
    INNER JOIN tblEmails e ON e.custom = bq.QuoteID
    WHERE bq.status = 'Queued'
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

Ken*_*her 7

是的,你可以为所欲为。它不完全是一个变量,但它的工作原理是一样的。这是您可以使用CROSS APPLY的几种方法之一。

SELECT
      bq.quoteID
    , bq.unsentNumber
    , bq.sendSubsequent
    , bq.unsentDelay
    , sr.contractorID
    , CASE 
        WHEN (ComputedColumns.MyDateAdd  - FLOOR(ComputedColumns.MyDateAdd)) <= ((ComputedColumns.MyDate) - FLOOR(ComputedColumns.MyDate))
            THEN 1
            ELSE 0
        END AS 'Add Bid'
    , DATEADD(n, bq.markupDelay, sr.lastviewed) AS 'Send Time'
    , GETDATE() AS 'Time Now'  
    , e.email
    , e.name
FROM tblCustomerBidQueue bq
INNER JOIN tblServiceRecords sr ON bq.QuoteID = sr.cartID AND sr.status = 'Bid' AND bq.status = 'Queued'
INNER JOIN tblContractors c ON c.ID = sr.contractorID
INNER JOIN tblEmails e ON e.custom = bq.QuoteID
CROSS APPLY (SELECT CAST(DATEADD(n, bq.markupDelay, sr.lastviewed) AS FLOAT) AS MyDateAdd,
                CAST(GETDATE() AS FLOAT) AS MyDate) ComputedColumns
WHERE bq.status = 'Queued'
Run Code Online (Sandbox Code Playgroud)

基本上你CROSS APPLY你的变量,然后你可以使用它们,就好像它们是表的列一样。

  • 从 SQL Server 2008 开始,有一种时间数据类型。作为时间而不是浮动,您不必弄乱整个“地板”。 (2认同)