mysql DATE_FORMAT STR_TO_DATE日期子查询

时间:2014-05-10 11:33:27

标签: php mysql date date-format str-to-date

这是RECORDS MySQL TABLE:

ID - BIGINT(20)
DATE - DATE

记录:

ID Date
1  2014-03-01
2  2014-03-02
3  2014-04-01
4  2014-04-02

这是第一个查询:

SELECT id, DATE_FORMAT(date,'%d/%m/%Y') AS date FROM records
WHERE
date >= STR_TO_DATE('01/04/2014','%d/%m/%Y') AND
date <= STR_TO_DATE('30/04/2014','%d/%m/%Y') 

一切都很好,我得到了结果:

3,2014-04-01
4,2014-04-02

但是,当我尝试使用这样的子查询来获取日期范围时:

SELECT * 
FROM (SELECT id, DATE_FORMAT(date,'%d/%m/%Y') AS date 
      FROM records) AS TEST
WHERE
date >= STR_TO_DATE('01/04/2014','%d/%m/%Y') AND
date <= STR_TO_DATE('30/04/2014','%d/%m/%Y') 

我得到一个空结果集(即零行)。

我的错误在哪里?

3 个答案:

答案 0 :(得分:1)

据我了解,您希望以%d/%m/%Y格式返回日期。 我在您的问题中为您的第一个查询获得的结果确实产生了这个转换日期,您确定这是您使用的查询吗?

无论哪种方式,如果这是您想要的,我相信您应该将查询更改为以下内容:

SELECT id, DATE_FORMAT(date,'%d/%m/%Y') AS datestring FROM records
WHERE
date >= STR_TO_DATE('01/04/2014','%d/%m/%Y') AND
date <= STR_TO_DATE('30/04/2014','%d/%m/%Y')

即使在比较中使用日期列而不是别名,我认为它澄清了事情。

这是显示结果的SQLFiddle,因为您可以看到第一个查询返回了所需的结果。

答案 1 :(得分:0)

你必须在TEST中包含你的where子句。

  SELECT * 
 FROM (SELECT id, DATE_FORMAT(date,'%d/%m/%Y') AS date 
  FROM records
 WHERE
 date >= STR_TO_DATE('01/04/2014','%d/%m/%Y') AND
 date <= STR_TO_DATE('30/04/2014','%d/%m/%Y') 
   ) AS TEST

但我不知道在这里使用子查询的原因是什么?

编辑:

试试这个

 select * FROM(
 SELECT id, CASE WHEN date BETWEEN STR_TO_DATE('01/04/2014','%d/%m/%Y')
                           AND STR_TO_DATE('30/04/2014','%d/%m/%Y') 
                 THEN DATE_FORMAT(date,'%d/%m/%Y') 
            END AS date 
 FROM records
) as TEST
WHERE //////  some other conditions

答案 2 :(得分:0)

DATE,DATETIME和TIMESTAMP是自然排序的数据类型。也就是说,当你使用不等式和BETWEEN语句时,它们会做你期望的。

他们的默认文字表示 - 2014-05-07 11:59:56 - 在按文字排序时也恰好是自然排序的。

但是当您执行DATE_FORMAT(日期,'%d /%m /%Y')时,您将自然排序的表示转换为非自然排序的表示。

    03/15/2014  will sort before
    03/16/2013  
事实上,即使它之前也没有。

如果您想进行日期算术,则需要将日期保持为自然排序的形式,直到它们实际显示为止。大多数人不在SQL中使用DATE_FORMAT()将日期转换为可显示的格式;相反,他们使用Java或PHP程序来进行显示。这样日期仍然是自然有序的。

在您的问题中,您的外部查询无法判断它是否在日期之间进行了BETWEEN。你告诉它要对琴弦进行BETWEEN,这不是自然命令的。

你在评论@ echo_Me的问题时说你​​不想在子查询中使用BETWEEN。您必须将DATE_FORMAT放在外部查询中,或者将BETWEEN放在子查询中。