这是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')
我得到一个空结果集(即零行)。
我的错误在哪里?
答案 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放在子查询中。