SQL查询在两个日期之间进行选择

时间:2012-02-22 14:34:12

标签: sql mysqli isqlquery

我想在两个日期之间选择记录 - startDate和endDate(它们是sql中的日期/时间格式)。我有以下sql查询,但它不起作用,有人可以告诉我我做错了什么?

"SELECT * 
FROM house 
WHERE startDate >= '2012/02/22 00:00:00' AND endDate <= '2012-02-25 00:00:00'"

4 个答案:

答案 0 :(得分:3)

我建议将日期转换为日期时间并比较它们以及保持日期标准和一致性。类似的东西:

"SELECT * 
FROM house 
WHERE DATE(startDate) >= DATE('2012-02-22 00:00:00') 
  AND DATE(endDate) <= DATE('2012-02-25 00:00:00')"

注意:我假设您的startDate和endDate的格式与您提供的字符串相同。

答案 1 :(得分:2)

您是否希望startDate'2012-02-22'或更晚且endDate的所有行均为'2012-02-22'或之前?然后,使用:

SELECT * 
FROM house 
WHERE startDate >= '2012-02-22' 
  AND endDate < '2012-02-26'           --- notice the `<`, not `<=`
                                       --- and the `day+1`

在SQL产品中使用日期时,最好在查询和语句中使用此格式:'20120222'或此(我觉得更容易阅读:'2012-02-22'

建议不要使用'2012/02/22'之类的斜杠或Year-Month-Day以外的任何其他顺序。

没有必要包含时间部分。 '2012-02-22 00:00:00''2012-02-22'相同。

使用endDate <= '2012-02-25 00:00:00'表示日期为2012年2月25日但午夜之后('00:00:00')的任何行都不符合条件。如果您也想要这些行,请改用endDate < '2012-02-26'

您可以使用DATE(endDate) <= DATE('2012-02-25 00:00:00')DATE(endDate) <= '2012-02-25'但这些条件是“不可搜索的”,因此您的查询将无法使用endDate上的索引。

答案 2 :(得分:0)

MySql中的内置STR_TO_DATE函数采用与date_format相同的格式掩码。

start_date >= str_to_date('2012/02/22 00:00:00','%Y/%m/%d %h:%i:%s)

答案 3 :(得分:0)

我猜这是类型转换问题的原因,因为您在where子句中匹配的输入不同,即该列是日期或日期时间类型,并且您使用手动字符串格式进行匹配,请使用{{ 1}}的左侧,以匹配右侧的格式,或在右侧使用to_char

to_date()