以下查询:

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


不返回任何内容。

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

评论

请谨慎使用BETWEEN,因为最小值和最大值均被视为在范围内,因此请勿对最小值和最大值(日期大小写)的日期进行两次处理。例如,日期2010-09-29 00:00:00将在2010-09-28 00:00:00和2010-09-29 00:00:00之间,并且在2010-09-29 00之间: 00:00和2010-09-30 00:00:00

是的,他说了什么^^

#1 楼

您的第二个日期早于您的第一个日期(即,您正在查询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进行更新,是否应该以相同的方式工作?

–印格斯
17-6-27 at 9:55



@IngusGraholskis:where子句在select或update语句上的作用应相同。

– T30
17年6月30日在12:37

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

– KeaganFouche
19年1月21日在22:04

如果两个日期都为null或为空,如何返回所有数据?

–编码世界
1月22日11:08

#2 楼

您的查询日期应为

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


try

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


#3 楼

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

应为:

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


#4 楼

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

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


评论


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

–弗朗兹·格莱希曼(Franz Gleichmann)
16 Dec 15'在6:39

#5 楼

作为@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')


内部。

这反过来会导致结果不包含时间值大于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')


#6 楼

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

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


#7 楼

使用日期和时间值时,必须将字段强制转换为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))


#8 楼

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

评论


问题在于较早的日期早于较新的日期列出。

–theninjagreg
15年6月24日在20:09

#9 楼

只需将date_field转换为日期

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


#10 楼

尝试切换日期:

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