INTERVAL 30 DAY 未给出预期结果
Posted
技术标签:
【中文标题】INTERVAL 30 DAY 未给出预期结果【英文标题】:INTERVAL 30 DAY not giving expected result 【发布时间】:2015-09-09 22:30:59 【问题描述】:我对 mysql DATE 和 DATE_FORMAT 有点熟悉。
但是,当使用 INTERVAL - 30 DAY 对日期范围运行查询时,要么没有得到正确的输出,要么会引发错误。进一步查看表格,发现 date_buy 的每一行都是这种格式: 2015 年 9 月 9 日星期一等。我尝试使用 php date('D d F Y') 代替 DATE(NOW()) 等,但无法解决问题。是否有另一种已知的解决方法?
是的,已经尝试了 date_buy_x 和 date_buy_y 之间的选择。即使表中有记录,它也不返回任何内容。
SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales`
WHERE date_buy >= $date - INTERVAL 30 DAY
GROUP BY date_buy
SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales`
WHERE date_buy BETWEEN date_buy_x && date_buy_y
GROUP BY date_buy ORDER BY date_buy DESC
更新
因此,根据建议,并进一步研究 DATE_FORMAT 和 CURDATE 参数,已经能够显示数据。 ORDER BY 也必须在 DATE_FORMAT(date_buy, '%a %d %M %Y') 中才能正确输出。但是,关于 INTERVAL 30 DAY 参数的问题仍然存在。
WHERE datebuy <= DATE_FORMAT(CURDATE() - INTERVAL 30 DAY,'%a %d %M %Y')
GROUP BY date_buy ORDER BY DATE_FORMAT(date_buy, '%a %d %M %Y') DESC
这是带回数据但仍然超出范围,这让我认为它不接受 INTERVAL 请求。
Sat 22 November 2014 (50 sales)
Thu 18 December 2014 (50 sales)
Thu 22 January 2015 (20 sales)
Sun 25 January 2015 (20 sales)
Mon 06 April 2015 (25 sales)
Sun 12 April 2015 (25 sales)
Mon 03 August 2015 (10 sales)
当输出应该只是:
Mon 03 August 2015 (10 sales)
【问题讨论】:
不要将日期存储为字符串!恐怖。修复日期存储,其他一切都会修复它自己 达贡。该解决方案需要这种特殊的日期格式用于跨页面的其他显示,这就是它以这种方式存储的原因。在行中修复当前日期会很痛苦。 写一些东西来读取该字段中的日期,解析它们,并将它们以适当的日期格式保存到您以后将使用的新字段中。 需要在多个页面中以该格式显示日期意味着您使用带有DATE_FORMAT(...)
的选择语句将其转换为该格式,而不是您以该格式存储它。
正确。我从另一家开发公司继承了这个。我试图找到一个永久修复,而不是绷带。我的第一个想法是按照建议解析当前格式,删除日期(D)部分,然后更新所有记录,但想看看是否有另一个更相关的解决方案。
【参考方案1】:
你可以想象得到:
SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales`
WHERE DATE(STR_TO_DATE(date_buy, '%a %d %M %Y')) >= $date - INTERVAL 30 DAY
GROUP BY date_buy
除非$date
也是这种字符串格式,在这种情况下你也需要使用STR_TO_DATE函数。
SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales`
WHERE DATE(STR_TO_DATE(date_buy, '%a %d %M %Y')) >= DATE(STR_TO_DATE($date, '%a %d %M %Y')) - INTERVAL 30 DAY
GROUP BY date_buy
【讨论】:
我完全忽略了 %a。我确实尝试了 %W,结果证明是漫长的一天。 face-plams self 。谢了哥们。我试试看。 希望您没有太多数据,因为这是性能杀手 我会使用 STR_TO_DATE 来解析日期并更新一个新字段,然后切换字段或类似的东西,因为在 where 子句中不断进行转换会损害性能【参考方案2】:date_sub()
怎么样,查询时用date_format
换成同样的格式
SELECT SUM(sales_total), date_buy FROM `Sebastian Estate Sales`
WHERE DATE_FORMAT(DATE(date_buy,'%Y %m %d')) >= DATE_FORMAT(DATE_SUB(DATE($date,INTERVAL 30 DAY),'%Y %m %d'))
GROUP BY date_buy
【讨论】:
以上是关于INTERVAL 30 DAY 未给出预期结果的主要内容,如果未能解决你的问题,请参考以下文章