两列之间的Mysql日期时间

时间:2013-03-12 17:56:14

标签: mysql sql datetime range

我在事件表中有两列(都是datetime)startDate和endDate。 我正在使用php的date()函数检索当天。

这导致例如2013-03-12。

现在有三种可能的事件与今天发生的日期相结合:

  1. 活动开始并在当天结束
  2. 事件已提前开始并于今天结束
  3. 活动今天开始,但将来结束(> = 2013-03-13)
  4. 现在我想将这些全部分解为单独的查询,因为我不习惯使用日期。我从第一个查询开始,但我已经失败了。我尝试了以下内容:

    SELECT * FROM events WHERE (startDate= '2013-03-12' AND endDate= '2013-03-12')
    

    以及:

    SELECT * FROM events WHERE NOT (startDate < '2013-03-12' OR endDate > '2013-03-12')
    

    我已尝试使用DATE()以及格式化日期,例如“2013-03-12%”。

    我不知道为什么它不起作用,我确信至少有一个事件发生在12日。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:4)

尝试使用MySQL的DATE()函数将日期列修剪为日期部分:

SELECT * 
FROM events 
WHERE (DATE(startDate) = '2013-03-12' AND DATE(endDate)= '2013-03-12')

答案 1 :(得分:3)

你可以使用DATE()函数作为建议的其他答案,但我认为这使得很难在列上使用索引。相反,您可以在比较中包含时间:

SELECT *
FROM events
WHERE startDate BETWEEN '2013-03-12 00:00:00' AND 2013-03-12 23:59:59
  AND endDate BETWEEN '2013-03-12 00:00:00' AND 2013-03-12 23:59:59

答案 2 :(得分:1)

MySQL中的DATETIME数据类型也考虑了当天的时间,因此,它不会匹配任何内容。

如果您没有使用时间部分,那么您可以简单地将数据类型减少到DATE而不是DATETIME。如果没有,您可以使用DATE()函数去掉时间部分,只考虑日期部分

答案 3 :(得分:0)

请注意,在Mysql上使用 between

date_column_name between 'startDate' AND 'endDate'

注意:您应该向endDate插入+1日期。因为当您将2015-05-18日期插入endDate时,您无法获取2015-05-18的数据。因此,您需要将一个日期加上endDate