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

查询:

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

返回什么。

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

888901 次浏览

date_field是否属于datetime类型?此外,你还需要把较早的日期放在前面。

它应该是:

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

第二次约会要在第一次约会之前。您是在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')

试着换个日期:

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

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

您的查询应该有日期为

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

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

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

作为对@sabin的回答的扩展,如果你只想比较日期部分(没有时间):

如果要比较的字段来自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')

你可以手动做,通过比较大于或等于和小于或等于。

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

仅仅将date_field转换为date

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

当使用Date 而且 Time值时,必须将字段转换为DateTime而不是Date。 试一试:< / p >

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

显示两个特定日期之间的帖子(例如):

一个场合开始于(04-12),结束于(04-14),而不选择查询中的年份,使其每年在指定的日期上循环,所以我的目标是在开始日期上显示该场合,并在结束日期上自动隐藏它,如下所示:

$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"
);

现在,事件只在这些指定的日期之间开始和消失,而不是在这之后或之前。

我刚刚在mariaDB上测试了2个案例,如下:

Case 1: SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10' // include 2016-12-10
Case 2: SELECT * FROM table_name WHERE (date_field BETWEEN '2016-12-01' AND '2016-12-10') // not include 2016-12-10