替代MySQL中的strtotime()

时间:2015-08-04 12:02:42

标签: php mysql datetime

我有一个包含这些字段的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_FORMATCONCAT_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')

我在这里和网上看了很多类似的问题,但是他们都有一个日期字段可以使用,而且不需要连接任何东西,所以我不能使用它们中的任何一个。

2 个答案:

答案 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我并不关心时间。否则我将其包括在条件中。