我有一个类似的表:
+---------------------+---------------------+
| 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
我正在寻找"正确"的答案,理想情况下没有子查询或连接。
编辑:
假设from
总是排在to
之前,你甚至不需要LEAST:
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)
这两个日期之间总是有一定的时间间隔吗?当它总是相同的时候,它不应该很难,因为你可以使用这样的东西:
Update 'table'
Set to = from + INTERVAL 1 DAY
显然,您可以更改适合您查询的天数
我将首先编写一个查询,以获得具有空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;
您可以使用
获取每列中最近的日期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。