没有在每行

时间:2017-09-05 19:07:12

标签: mysql

我有一张表格如下:

time   datetime

我只想选择该表的行,给出两个信息:该行上存在的时间和之前行上的时间,以便我们可以显示一组时间窗口。例如,使用此记录:

2017-07-01 20:00:00
2017-07-01 07:00:00
2017-04-04 23:52:00

将返回以下时间窗口:

2017-07-01 20:00:00 - null
2017-07-01 07:00:00 - 2017-07-01 20:00:00
2017-07-01 20:00:00 - 2017-04-04 23:52:00

我虽然使用变量,先选择变量并在每一行上设置变量,但能够定义一个时间窗口,如下例所示:

SELECT @END_DATE date_time_to, @END_DATE := date_time date_time_from FROM (
  SELECT cast('2017-07-01 20:00:00' as DATETIME) AS date_time
  UNION
  SELECT cast('2017-07-01 07:00:00' as DATETIME) AS date_time
  UNION
  SELECT cast('2017-04-04 23:52:00' as DATETIME) AS date_time
) a ORDER BY date_time desc;

当变量以某种方式设置时,这是有效的,但在第一次运行时,它只是提供以下结果:

+--------------+---------------------+
| date_time_to | date_time_from      |
+--------------+---------------------+
| NULL         | 2017-07-01 20:00:00 |
| NULL         | 2017-07-01 07:00:00 |
| NULL         | 2017-04-04 23:52:00 |
+--------------+---------------------+

如果我只是将null设置为变量(SET @END_DATE := NULL)并再试一次,我得到:

+---------------------+---------------------+
| date_time_to        | date_time_from      |
+---------------------+---------------------+
| NULL                | 2017-07-01 20:00:00 |
| 2017-07-01 20:00:00 | 2017-07-01 07:00:00 |
| 2017-07-01 07:00:00 | 2017-04-04 23:52:00 |
+---------------------+---------------------+

这是我想要的结果,但每当我在我的应用程序上使用它时,我都没有设置任何变量,并且我不断得到第一列的结果null我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

在连接中初始化变量。

SELECT @END_DATE date_time_to, @END_DATE := date_time date_time_from FROM (
  SELECT cast('2017-07-01 20:00:00' as DATETIME) AS date_time
  UNION
  SELECT cast('2017-07-01 07:00:00' as DATETIME) AS date_time
  UNION
  SELECT cast('2017-04-04 23:52:00' as DATETIME) AS date_time
) a 
CROSS JOIN (SELECT @END_DATE := NULL) b
ORDER BY date_time desc;