0

我有一个 MySQL 问题。我有一个包含三列的表:“salesdate”(包含日期)、“salestime”(包含时间)和“remaining”(包含整数)。该表包含过去和未来的日期。我想从“剩余”中选择一个与当前日期和时间最接近的值。

我在下面构建了查询,但它只选择日期和时间值都为真的值。这可能会产生错误的结果,因为“salesdate”中可能有昨天日期的行,但所有“salestime”值都大于当前时间 - 所以我当前的查询会忽略这些......即使它们是最接近的到当前日期/时间。

我目前的查询:

$result = mysql_query(
"SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME() 
ORDER BY salesdate DESC
LIMIT 1 ");

我认为我需要做的是首先查询日期,然后以某种方式过滤此列表以显示最接近当前时间的日期/时间?但如何?如果您能提供帮助 - 我已经搜索并找不到明确的分步方法。非常感谢您的帮助。

4

3 回答 3

1

最接近当前时间?

第一个问题是你的数据设计是错误的。如果时间和日期都指同一事件,则信息应由单个日期时间字段表示 - 而不是 2 个单独的字段。因此,您对该数据运行的任何查询都将非常低效。

此外,从您的描述中不清楚销售日期+时间是否可能在未来。

因此,使用您当前的架构:

SELECT remaining 
FROM quantity_time  
ORDER BY ABS(NOW() - timestamp(salesdate,salestime)) DESC
LIMIT 1

“剩余”一词意味着您正在使用它来确定库存水平 - 这意味着您的架构非常错误。表示股票和交易的正确方法是通过 2 个单独的实体(表)。

于 2013-04-18T20:56:41.250 回答
0
SELECT remaining FROM (
SELECT remaining,
(UNIX_TIMESTAMP(salesdate) - UNIX_TIMESTAMP()) AS difference
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME()
) subquery
ORDER BY difference DESC
LIMIT 1

我不知道这是否非常高效,但这至少应该有效。它首先创建一个子查询,以秒为单位计算时间差,然后按差值排序。

于 2013-04-18T20:19:50.020 回答
0

与当前日期时间最接近的意思是什么?

放一些范围,我不知道它应该有多准确,但是:

SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime BETWEEN date_sub(NOW(), INTERVAL 24 HOUR) AND date_add(NOW(), INTERVAL 24 HOUR)
ORDER BY salesdate DESC
LIMIT 1
于 2013-04-18T20:20:06.850 回答