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

时间:2010-09-29 14:35:14

标签: mysql sql

以下查询:

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

什么都不返回。

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

11 个答案:

答案 0 :(得分:401)

您的第二个日期是在您的第一次约会之前(即您在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')

答案 1 :(得分:22)

您的查询的日期应为

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')

答案 2 :(得分:15)

类型为date_field的{​​{1}}?你还需要先把日期放在第一位。

应该是:

datetime

答案 3 :(得分:12)

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

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

答案 4 :(得分:5)

作为@sabin答案的扩展和一个提示,如果只想比较 date 部分(没有时间):

如果要比较的字段来自 datetime 类型,并且仅指定日期进行比较,那么这些日期将在内部转换为 datetime 值。这意味着以下查询

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')

内部。

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

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

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

答案 5 :(得分:3)

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

 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';

答案 6 :(得分:1)

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

答案 7 :(得分:1)

只需将date_field强制转换为日期

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

答案 8 :(得分: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))

答案 9 :(得分:0)

尝试切换日期:

2010-09-29 > 2010-01-30?

答案 10 :(得分:0)

我花了将近 2 个多小时的时间搜索并尝试只显示 2 个特定日期之间的帖子,例如:

一个场合从 (04-12) 开始并在 (04-14) 结束,没有在查询中选择一年,使其每年在指定日期重复出现,所以我的目标是在 startdate 显示那个场合并隐藏它自动在结束日期如下:

$stmt = $db->query(
"SELECT *, 
FROM table 

WHERE (CAST(CURDATE() AS date) 

BETWEEN 

CAST(table.date_start AS date) 
AND 
CAST(table.date_end AS date)) 

LIMIT 1"
);

现在,场合仅在这些指定日期之间开始和消失,而不是之后或之前。希望它对某人有所帮助,非常感谢:)