如何使用MySQL在两个日期之间查询?


225

以下查询:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

什么也不返回。

我应该有足够多的数据来使查询工作。我究竟做错了什么?


32
请谨慎对待BETWEEN,因为minmax值均被视为在范围内,因此请勿对min和或日期max(边缘情况)的日期进行两次处理。例如,日期2010-09-29 00:00:00之间2010-09-28 00:00:002010-09-29 00:00:00和还 2010-09-29 00:00:002010-09-30 00:00:00
minipif

是的,他说了什么^^
Albert Rannetsperger

Answers:


471

您的第二个日期早于您的第一个日期(即,您正在查询2010年9月29日至2010年1月30日之间)。尝试颠倒日期顺序:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

我确实知道这一点,但现在有UPDATE问题。我正在尝试使用BETWEEN进行更新,是否应该以相同的方式工作?
格斯(Angus)

3
@IngusGraholskis:where子句应在selectupdate语句上作用相同。
T30

就我个人而言,我发现术语“从”和“到”是一种偷偷摸摸的方式来记住应编写查询的顺序。
KeaganFouche

如果两个日期均为空或为空,如何返回所有数据?
编码世界

23

您的查询的日期应为

select * from table between `lowerdate` and `upperdate`

尝试

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

20

date_field类型的datetime吗?另外,您需要将最早的日期放在第一位。

它应该是:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

17

DATE()是一个MySQL函数,仅提取日期或日期/时间表达式的日期部分

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

可以添加一个解释,以便人们理解您在做什么。
Franz Gleichmann '16

6

作为@sabin答案的扩展名和提示(如果您只想比较日期部分(无时间)):

如果进行比较的字段是从型日期时间和仅日期用于比较指定,则这些日期内部转换为日期时间值。这意味着以下查询

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

将被转换为

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

内部。

反过来,这将导致结果不包含时间值大于00:00:00的2010-09-29对象!

因此,如果也应包括所有日期为2010-09-29的对象,则必须将要比较的字段转换为日期:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')

4

您可以通过与大于或等于和小于或等于进行比较来手动完成此操作。

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

在我们的示例中,我们需要每天检索特定日期的数据。我们将从一天的开始到另一天的最新秒进行比较。

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';

1

服务器端或客户端的日期配置可能会出现问题。我发现当主机以西班牙语,法语或其他任何方式配置时,这是多个数据库上的常见问题,可能会影响dd / mm / yyyy或mm / dd / yyyy格式。


3
问题是较旧的日期早于较新的日期列出。
theninjagreg

1

只需将date_field转换为日期

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

使用日期时间值时,必须将字段强制转换为DateTime而不是Date。尝试:

SELECT * FROM `objects` 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.