MySQL日期时间在两个列之间

5

我有一个事件表,其中包含两列(startDate和endDate),都是datetime类型。 我使用php的date()函数检索当前日期。

这将得到例如2013-03-12。

现在有三种情况需要考虑:

  1. 活动在这一天开始并结束
  2. 活动已经开始,并在今天结束
  3. 活动从今天开始但在未来结束(>= 2013-03-13)

现在我想将它们分为单独的查询,因为我不习惯处理日期。 我首先尝试了第一个查询,但已经失败了。 我尝试了以下内容:

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号。非常感谢您的帮助。


问题在于 datetime 列包括了 时间 信息。 - Barmar
4个回答

7

尝试使用MySQL的DATE()函数将日期列截取为仅包含日期部分:

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

啊..我在我的输入日期上使用了DATE()函数! - Gooey
我可以在两个不同的日期时间字段之间使用 between 吗? - Moeez
@Moeez 我已经尝试使用BETWEEN和DATE。它可以正常工作。 SELECT * FROM events WHERE DATE(start_date) BETWEEN '2013-03-12' AND '2013-03-12'; 它会返回在'2013-03-12 00:00:00'和'2013-03-12 23:59:59'之间的数据。 - A.JRJ

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

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

如果您不需要时间部分,则可以将数据类型简单地缩小为DATE而不是DATETIME。否则,您可以使用DATE()函数去除时间部分并仅考虑日期部分。


0

在使用 Mysql 的 between 时请注意

date_column_name between 'startDate' AND 'endDate'

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接