MySql 获取日期时间晚于现在的第一行的案例语句
MySql Case statement to get first row where datetime is after now
我有一个查询,当前将当前约会突出显示为 "NOW",将所有后续约会突出显示为 "NEXT"。我无法调整它,但只显示一个约会是下一个约会。
这是我目前所拥有的...
SELECT
user_name,
DATE(apt_start_datetime) AS apt_date,
TIME(apt_start_datetime) AS apt_start_time,
TIME(apt_end_datetime) AS apt_end_time,
CASE
WHEN (NOW() BETWEEN apt_start_datetime AND apt_end_datetime) THEN 'NOW'
ELSE
CASE WHEN (NOW() < apt_start_datetime) THEN 'NEXT' ELSE NULL END
END AS now_next
FROM
users
JOIN
apts ON DATE_FORMAT(CURDATE(), "%x%v") = DATE_FORMAT(apt_start_datetime, "%x%v")
WHERE
user_id = 123456
ORDER BY
apt_date,
apt_start_time
这 returns 类似于:
user_name apt_date apt_start_time apt_end_time now_next
--------------------------------------------------------------------------
user1 2015-11-20 10:45:00 10:55:00 null
user2 2015-11-20 10:55:00 11:55:00 NOW
user3 2015-11-20 11:55:00 12:15:00 NEXT
user4 2015-11-20 12:15:00 12:35:00 NEXT
user5 2015-11-20 12:35:00 12:55:00 NEXT
但我想要的是:
user_name apt_date apt_start_time apt_end_time now_next
--------------------------------------------------------------------------
user1 2015-11-20 10:45:00 10:55:00 null
user2 2015-11-20 10:55:00 11:55:00 NOW
user3 2015-11-20 11:55:00 12:15:00 NEXT
user4 2015-11-20 12:15:00 12:35:00 null
user5 2015-11-20 12:35:00 12:55:00 null
有什么想法吗?
问题导致 sql
的这一部分
CASE WHEN (NOW() < apt_start_datetime) THEN 'NEXT' ELSE NULL END
所有 apt_start_datetime 早于 NOW() 的行将具有 "NEXT".
您必须找到 first apt_start_datetime ,然后是 NOW() 并且此日期时间用于比较而不是 apt_start_datetime.
在伪 sql 中类似于
CASE WHEN (NOW() < (SELECT apt_start_datetime FROM tbl WHERE apt_start_datetime > NOW() ORDER BY DIFF(apt_start_datetime,NOW()) DESC LIMIT 1)) THEN 'NEXT' ELSE NULL END
编辑:这是最简单的解决方案,但会很慢
我有一个查询,当前将当前约会突出显示为 "NOW",将所有后续约会突出显示为 "NEXT"。我无法调整它,但只显示一个约会是下一个约会。
这是我目前所拥有的...
SELECT
user_name,
DATE(apt_start_datetime) AS apt_date,
TIME(apt_start_datetime) AS apt_start_time,
TIME(apt_end_datetime) AS apt_end_time,
CASE
WHEN (NOW() BETWEEN apt_start_datetime AND apt_end_datetime) THEN 'NOW'
ELSE
CASE WHEN (NOW() < apt_start_datetime) THEN 'NEXT' ELSE NULL END
END AS now_next
FROM
users
JOIN
apts ON DATE_FORMAT(CURDATE(), "%x%v") = DATE_FORMAT(apt_start_datetime, "%x%v")
WHERE
user_id = 123456
ORDER BY
apt_date,
apt_start_time
这 returns 类似于:
user_name apt_date apt_start_time apt_end_time now_next
--------------------------------------------------------------------------
user1 2015-11-20 10:45:00 10:55:00 null
user2 2015-11-20 10:55:00 11:55:00 NOW
user3 2015-11-20 11:55:00 12:15:00 NEXT
user4 2015-11-20 12:15:00 12:35:00 NEXT
user5 2015-11-20 12:35:00 12:55:00 NEXT
但我想要的是:
user_name apt_date apt_start_time apt_end_time now_next
--------------------------------------------------------------------------
user1 2015-11-20 10:45:00 10:55:00 null
user2 2015-11-20 10:55:00 11:55:00 NOW
user3 2015-11-20 11:55:00 12:15:00 NEXT
user4 2015-11-20 12:15:00 12:35:00 null
user5 2015-11-20 12:35:00 12:55:00 null
有什么想法吗?
问题导致 sql
的这一部分CASE WHEN (NOW() < apt_start_datetime) THEN 'NEXT' ELSE NULL END
所有 apt_start_datetime 早于 NOW() 的行将具有 "NEXT".
您必须找到 first apt_start_datetime ,然后是 NOW() 并且此日期时间用于比较而不是 apt_start_datetime.
在伪 sql 中类似于
CASE WHEN (NOW() < (SELECT apt_start_datetime FROM tbl WHERE apt_start_datetime > NOW() ORDER BY DIFF(apt_start_datetime,NOW()) DESC LIMIT 1)) THEN 'NEXT' ELSE NULL END
编辑:这是最简单的解决方案,但会很慢