我有一张表格如下:
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我在这里做错了什么?
答案 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;