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



我有一个类似的表:

+---------------------+---------------------+
| 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();

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

相关内容

  • 没有找到相关文章

最新更新