我有一张类似的表:
+---------------------+---------------------+
| from | to |
+---------------------+---------------------+
| 2014-07-01 01:00:00 | NULL |
+---------------------+---------------------+
| 2015-08-01 02:00:00 | 2015-10-01 02:00:00 |
+---------------------+---------------------+
| 2015-09-01 03:00:00 | 2015-10-01 03:00:00 |
+---------------------+---------------------+
我需要知道未来的下一个日期时间,应该是:2015-08-01 02:00:00
我正在寻找“正确”的答案,理想情况下没有子查询或连接。
答案 0 :(得分:1)
编辑:
假设每行from
始终在to
之前,您甚至不需要至少:
SELECT MIN(IF(`from` > NOW(), `from`, `to`))
FROM `yourtable`
WHERE `from` > NOW()
OR `to` > NOW();
这是有效的,因为from
或to
中的一个必须> NOW()
或WHERE
消除该行。所以在程序伪代码中,这就像
x = ("from" where "from" is > now) and
("to" where "from" is < now and "to" > now)
min(x)
答案 1 :(得分:0)
这两个日期之间总是有一定的时间吗?当它始终相同时,它不应该变硬,因为你可以使用这样的东西:
Update 'table'
Set to = from + INTERVAL 1 DAY
显然,您可以更改适合查询的天数。
答案 2 :(得分:0)
我首先编写一个查询来获取所有具有空to
列的行,以及从每行获取最小日期的查询,然后在最小行的条件下将它们连接在一起日期晚于第一个表中的日期:
SELECT m.*, t.dateCol
FROM myTable m
JOIN(
SELECT LEAST(fromCol, toCol) AS dateCol
FROM myTable) t ON t.dateCol > m.fromCol AND m.toCol IS NULL;
完成后,您可以按fromCol
进行分组,并在下一个日期获得最低dateCol
:
SELECT m.fromCol, MIN(t.dateCol) AS nextDate
FROM myTable m
JOIN(
SELECT LEAST(fromCol, toCol) AS dateCol
FROM myTable) t ON t.dateCol > m.fromCol AND m.toCol IS NULL
GROUP BY m.fromCol;
在更新中看起来的方式是这样的:
UPDATE myTable m
JOIN(
SELECT m.fromCol, MIN(t.dateCol) AS nextDate
FROM myTable m
JOIN(
SELECT LEAST(fromCol, toCol) AS dateCol
FROM myTable) t ON t.dateCol > m.fromCol AND m.toCol IS NULL
GROUP BY m.fromCol) t ON t.fromCol = m.fromCol
SET m.toCol = t.nextDate;
以下是SQL Fiddle示例。
答案 3 :(得分:0)
您可以使用
获取每列中的下一个最近日期SELECT MIN(from) AS MinFrom, MIN(to) as MinTo FROM TABLENAME
获得两者中最小的一个是有点困难,需要嵌套,但它是可行的。
SELECT MIN(COM.Dates) FROM (
SELECT from AS Dates FROM TABLENAME
UNION
SELECT to FROM TABLENAME
) AS COM
编辑:意识到只需要一个总体MIN。