【问题标题】:Select the first occurrence of records with today's date using time field使用时间字段选择第一次出现的具有今天日期的记录
【发布时间】:2013-04-26 09:09:54
【问题描述】:

我有一个表,其中每个记录都有一个 date 字段和一个 time(7) 字段。将记录插入数据库后,它将记录插入日的日期和插入时间。

现在我想从Table1 INNER JOIN Table2 中选择今天第一次出现的所有记录,因为这些记录可以重复。我尝试使用time(7) 字段选择今天日期中record1 = 'ABC' 的最少时间,但这不会返回任何结果,我确信查询应该返回 1 个结果,因为它以不同的时间记录了两次,但与今天的日期。如何选择第一次出现今天日期的产品?

示例:

SELECT ProductName, Description, Quantity,
FROM Products
INNER JOIN Transactions
    ON Products.ProductID = Transactions.ProductID
WHERE Transactions.ProductID = 'A6612'
    AND CONVERT(VARCHAR(20), `Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
    AND Time_Tracked = (
        SELECT min(Time_Tracked)
        FROM Transactions
        )
    AND Country = 'United States'

【问题讨论】:

  • 必须返回多少条记录?
  • 一条记录,因为我有两个产品条目,一个在09:15:04,另一个在09:15:41,所以它会选择第一个。

标签: sql sql-server sql-server-2008


【解决方案1】:

将选项与 EXISTS 运算符一起使用。此外,您可以避免使用 CAST 函数而不是 CONVERT into VARCHAR 数据类型的无效条件(或谓词)

SELECT p.ProductName, p.Description, p.Quantity
FROM Products p INNER JOIN Transactions t ON p.ProductID = t.ProductID
WHERE t.ProductID = 'A6612' 
  AND CAST(t.Date_Tracked AS date) = CAST(GETDATE() AS date)
  AND EXISTS (                      
              SELECT 1
              FROM Transactions t2
              WHERE t.ProductID = t2.ProductID
                AND CAST(t2.Date_Tracked AS date) = CAST(GETDATE() AS date)
              HAVING MIN(t2.Time_Tracked) = t.Time_Tracked                      
              ) 
  AND Country = 'United States'

如果请求返回一条记录,只需在 TOP 子句中使用 ORDER BY 子句即可。

SELECT TOP 1 p.ProductName, p.Description, p.Quantity
FROM Products p INNER JOIN Transactions t ON p.ProductID = t.ProductID
WHERE t.ProductID = 'A6612' 
  AND CAST(t.Date_Tracked AS date) = CAST(GETDATE() AS date)
  AND p.Country = 'United States'
ORDER BY t.Time_Tracked

最后,如果 Date_Tracked 的类型为 datetime,那么:

SELECT TOP 1 p.ProductName, p.Description, p.Quantity
FROM Products p INNER JOIN Transactions t ON p.ProductID = t.ProductID
WHERE t.ProductID = 'A6612' 
  AND CAST(t.Date_Tracked AS date) = CAST(GETDATE() AS date)
  AND p.Country = 'United States'
ORDER BY CAST(t.Date_Tracked AS time)

【讨论】:

  • 工作,正是我需要的。是的,我已经读过Convert to varchargood 的低效率指出了这一点。
  • 不,你理解错了。转换没有错。您错过了子查询中的一个条件。这就是您的查询不返回任何内容的原因。
【解决方案2】:

您尝试过使用 rowid 吗?

SELECT ProductName, Description, Quantity,
FROM Products
INNER JOIN Transactions
    ON Products.ProductID = Transactions.ProductID
WHERE Transactions.ProductID = 'A6612'
    AND CONVERT(VARCHAR(20), `Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
    AND Transactions.rowid = (SELECT min(rowid)
        FROM Transactions group by productid,date) --This will give you the minimum rowid 
    AND Country = 'United States'                    --grouped by productid and date.  

【讨论】:

    【解决方案3】:

    你的查询应该是这样的,

    SELECT ProductName, Description, Quantity,
    FROM Products
    INNER JOIN Transactions
        ON Products.ProductID = Transactions.ProductID
    WHERE Transactions.ProductID = 'A6612'
        AND CONVERT(VARCHAR(20), Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
        AND Time_Tracked = (
            SELECT min(Time_Tracked)
            FROM Transactions
            WHERE CONVERT(VARCHAR(20), Transactions.Date_Tracked, 103) = CONVERT(VARCHAR(10), getdate(), 103)
            )
        AND Country = 'United States'
    

    【讨论】:

    • 可能缺少括号?
    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多