我有一个表 tbl_news,我想创建几个报告,例如今天、本周、本月。
我已将时间存储在“news_adate”处的 unix 时间戳中。对于本周的报告,我使用以下查询。
$first = date('Y-m-d',strtotime("monday this week"));
$last = date('Y-m-d',strtotime("sunday this week"));
$first = $first ." 00:00:01";
$last = $last ." 23:59:59";
$query = "SELECT count(nid), news_adate FROM tbl_news WHERE (news_adate between '".$first."' AND '".$last."') AND tbl_news.news_status=1 GROUP BY DATE(FROM_UNIXTIME(tbl_news.news_adate))" ;
我得到以下输出。
25-Oct 2015 1
27-Oct 2015 45
但实际上应该是
25-Oct 2015 1
26-Oct 2015 35
27-Oct 2015 10
不知道错误出在哪里?
最佳答案
只是在黑暗中拍摄,但您说 00:00:01 到 23:59:59 之间就错过了午夜时间,对吗?是什么促使您使用 Unix 时间戳而不是 MySQL now() 函数来存储日期时间值?我发现使用 trunc() 等 MySQL 函数查询 MySQL 日期格式要容易得多且更易于操作。通常我会存储两者,但在查询日期时,我更喜欢 MySQL 日期时间列,而不是表示时间的整数。 所以我的第一个建议是检查这个输出:
$first = date('Y-m-d',strtotime("monday this week"));
$last = date('Y-m-d',strtotime("sunday this week"));
$first = $first ." 00:00:01";
$last = $last ." 23:59:59";
$query = "SELECT count(nid), news_adate FROM tbl_news WHERE (news_adate between '".$first."' AND '".$last."') AND tbl_news.news_status=1 GROUP BY DATE(FROM_UNIXTIME(tbl_news.news_adate))" ;
Echo $query;
任何时候构建查询时,都应该检查字符串的值,以确保它确实是您想要查询的内容。
您还可以使用 Toad 等 SQL 工具来帮助您构建有效的查询并在用变量替换硬值之前检查其输出。
关于PHP MySQL group by unix Timestamp 用于报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33363786/