SELECT 仅记录字段中包含未来日期

SELECT only records with future date in field

我只想select未来的活动

event    s_date    start_time  end_time
event6   2015-01-30  19:45:00  21:45:00
event5   2015-01-29  20:45:00  21:45:00
event4   2015-01-29  19:45:00  21:45:00
event3   2015-01-28  00:30:00  03:00:00
event2   2015-01-27  09:00:00  11:00:00
event1   2015-01-26  19:45:00  21:45:00

我试过了,但没有得到正确的结果

SELECT s_date, DATE_FORMAT(s_date, '%W %D %M') AS date, CONCAT(s_date, ' ', end_time) AS dt
FROM schedule
GROUP BY s_date
HAVING dt >= NOW()

希望我没说错:

select * from 
(select s_date, max(concat(s_date,' ',start_time)) as dt
from schedule 
group by s_date
) as x
where STR_TO_DATE(x.dt, '%Y-%c-%e %r') >= NOW()

我认为未来事件是尚未播出的事件。

您可以使用 TIMESTAMP() 连接日期和时间,然后将其与当前时间进行比较。

例如,获取尚未开始的事件列表:

SELECT 
  event, start_time, end_time
FROM
  events
WHERE
  TIMESTAMP(s_date, start_time) > NOW()
;

请注意,这假定 start_time 和 end_time 的类型为 TIME。您应该考虑完全删除 s_date 字段并将 start_timeend_time 存储为 DATETIME 字段。

切记不要为此使用 TIMESTAMP 字段。尽管它们看起来相似,但 TIMESTAMP 会在记录更改时更新,而 DATETIME 仅存储您明确指定的值。

我不太确定您要对 GROUP BY 子句做什么。如果您使用它,它只会为您提供每个日期的一个事件。它甚至不会为您提供该日期的第一个事件,因为您没有明确设置订单。

如果您能阐明您对该部分的意图,我很乐意尝试改进此答案。

您正在使用 group by,但您没有聚合任何列...因此您在评估“concat()”表达式时获得的值将是随机的。

检查 this SQL fiddle 的解决方案:

SQL Fiddle

MySQL 5.5.32 架构设置:

create table schedule(
  event varchar(50),
  s_date date,
  start_time time,
  end_time time
);

insert into schedule 
values ('event6', '2015-01-30', '19:45:00', '21:45:00')
     , ('event5', '2015-01-29', '20:45:00', '21:45:00')
     , ('event4', '2015-01-29', '19:45:00', '21:45:00')
     , ('event3', '2015-01-28', '00:30:00', '03:00:00')
     , ('event2', '2015-01-27', '09:00:00', '11:00:00')
     , ('event1', '2015-01-26', '19:45:00', '21:45:00');

查询 1:

select s.*
from schedule as s
where concat(s_date, ' ', end_time) > now()

Results:

|  EVENT |                         S_DATE |                     START_TIME |                       END_TIME |
|--------|--------------------------------|--------------------------------|--------------------------------|
| event6 | January, 30 2015 00:00:00+0000 | January, 01 1970 19:45:00+0000 | January, 01 1970 21:45:00+0000 |
| event5 | January, 29 2015 00:00:00+0000 | January, 01 1970 20:45:00+0000 | January, 01 1970 21:45:00+0000 |
| event4 | January, 29 2015 00:00:00+0000 | January, 01 1970 19:45:00+0000 | January, 01 1970 21:45:00+0000 |
| event3 | January, 28 2015 00:00:00+0000 | January, 01 1970 00:30:00+0000 | January, 01 1970 03:00:00+0000 |

查询 2:

-- Little trick: 
-- In MySQL you can use HAVING without GROUP BY
-- to filter data using column aliases

select s.*, concat(s_date, ' ', end_time) as e_datetime
from schedule as s
having e_datetime > now()

Results:

|  EVENT |                         S_DATE |                     START_TIME |                       END_TIME |          E_DATETIME |
|--------|--------------------------------|--------------------------------|--------------------------------|---------------------|
| event6 | January, 30 2015 00:00:00+0000 | January, 01 1970 19:45:00+0000 | January, 01 1970 21:45:00+0000 | 2015-01-30 21:45:00 |
| event5 | January, 29 2015 00:00:00+0000 | January, 01 1970 20:45:00+0000 | January, 01 1970 21:45:00+0000 | 2015-01-29 21:45:00 |
| event4 | January, 29 2015 00:00:00+0000 | January, 01 1970 19:45:00+0000 | January, 01 1970 21:45:00+0000 | 2015-01-29 21:45:00 |
| event3 | January, 28 2015 00:00:00+0000 | January, 01 1970 00:30:00+0000 | January, 01 1970 03:00:00+0000 | 2015-01-28 03:00:00 |

希望对您有所帮助