SQL:从两列中的一列中选择将来的下一个日期时间

时间:2015-07-08 19:39:19

标签: mysql datetime

我有一张类似的表:

+---------------------+---------------------+
| 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

我正在寻找“正确”的答案,理想情况下没有子查询或连接。

4 个答案:

答案 0 :(得分:1)

编辑:

假设每行from始终在to之前,您甚至不需要至少:

SELECT MIN(IF(`from` > NOW(), `from`, `to`))
FROM `yourtable`
WHERE `from` > NOW()
   OR `to` > NOW();

这是有效的,因为fromto中的一个必须> 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。