我有一个包含这些字段的EventSet
表:
start_day
( ex. Monday )start_time
( ex.14:20:00 )我想创建一个查询,通过比较他们的日期和当前记录来选择特定记录。
所以,使用PHP strtotime();
方法的一点帮助,我的目标是:
SELECT *
FROM
`EventSet`
WHERE
DATE_FORMAT(NOW(), '%W %H:%i:%s') <=
date('%W %H:%i:%s', strtotime('start_day start_time'))
最后date();
部分当然是纯PHP
到目前为止,我已尝试将DATE_FORMAT
与CONCAT_WS
以及TIMESTAMP();
/ UNIX_TIMESTAMP();
一起使用,但显然是在搞乱某些事情。
SELECT *
FROM
`EventSet`
WHERE
DATE_FORMAT(NOW(), '%W %H:%i:%s') <=
DATE_FORMAT(CONCAT_WS(' ', start_day, start_time), '%W %H:%i:%s')
我在这里和网上看了很多类似的问题,但是他们都有一个日期字段可以使用,而且不需要连接任何东西,所以我不能使用它们中的任何一个。
答案 0 :(得分:1)
您正在使用<=
。这对于一周中的日期名称不起作用,因此将逻辑分为两部分:一部分用于星期几,另一部分用于时间:
SELECT e.*
FROM `EventSet` e
WHERE DATE_FORMAT(NOW(), '%W') = $start_day AND
DATE_FORMAT(NOW(), '%H:%i:%s') <= DATE_FORMAT($start_time, '%H:%i:%s')
注意:我离开date_format()
进行时间比较,我更喜欢:
SELECT e.*
FROM `EventSet` e
WHERE DATE_FORMAT(NOW(), '%W') = $start_day AND
TIME(NOW())) <= TIME($start_time)
答案 1 :(得分:0)
感谢Gordon Linoff和@spash58的解决方案,我现在已经有了一个工作代码。
然而,我正在扩展查询,以使时间取决于当天:
$conn = $this->getEntityManager()->getConnection();
$todayObject = new \DateTime();
$weekDay = $todayObject->format('N') - 1; // 0 - Monday; 6 - Sunday
$sql = "
SELECT
start_day,
start_time
FROM
EventSet
WHERE
is_active = 1 AND
(
WEEKDAY(NOW()) < start_day OR
(
WEEKDAY(NOW()) = start_day AND
TIME(NOW()) <= TIME(start_time)
)
)
ORDER BY start_day ASC
LIMIT 1
";
$st = $conn->prepare($sql);
$st->execute();
$data = $st->fetchAll();
start_date
字段现在转换为INT而不是字符串,以便于比较。如果当前的工作日小于start_day
我并不关心时间。否则我将其包括在条件中。