php - 根据当前日期选择整月期间的数据

标签 php mysql sql date timestamp

我最近接到的任务是编写一个报告工具来获取多个历史数据。 但我已经陷入了困境。我无法获取过去整月的数据。

故事: 用户获得一个字段,可以在其中输入他想要获取历史记录(过去几个月)的时间长度,例如:我想要过去 3 个月的数据。他输入他的值,发送数据并且(应该)得到这样的输出(因为现在是九月):

X data in August,
Y data in July,
Z data in June.

我的查询是:

SELECT * FROM table WHERE (publish_up between date_sub(NOW(), 
INTERVAL ".$history." MONTH)
AND date_sub(now(), INTERVAL " . -- $history . " MONTH))
AND created_by = '$editorID' AND state = 1 AND sectionid in (1,2,3)";

但有了这个,显然我总是能得到现在到 1 个月的数据。因此,我将向用户显示的数据是错误的,因为它在一个月中旬的某个地方开始,在另一个月中旬的某个地方结束。我希望该时间段从该月的第一天开始,到该月的最后一天结束。

我的第一个想法是,我可以从当前日期中减去当月已经过去的天数以获得上个月的第一天,但​​我不知道该怎么做。我也不知道如何获取该月份的名称。

最佳答案

您可以使用 PHP 函数 mktime 根据当前日期计算任意日期和 strtotime .

因此,我宁愿直接在 PHP 中计算所需的时间段,而不是使用笨拙、不可读的 SQL 函数:

$period_end = mktime(0,0,0, date('n'), 1, date('Y')); // first of current month, time 00:00:00
$period_begin = strtotime('-3 months', $period_end);

然后您可以将它们嵌入到您的 SQL 查询中,如下所示:

$query = "SELECT * FROM table WHERE publish_up BETWEEN '" .
         date('Y-m-d H:i:s', $period_begin) ."' AND '" .
         date('Y-m-d H:i:s', $period_end) ."' AND " 
         "created_by = '$editorID' AND state = 1 AND sectionid in (1,2,3)";

关于php - 根据当前日期选择整月期间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25743045/

相关文章:

php - 想要使用 PDO 制作复选框过滤器

mysql - 在 MySQL 中将十六进制转换为二进制

php - 仅显示 sql 查询的第一行

php - HTTP 500 错误 这很奇怪......网站无法显示此页面 Laravel

PHP 在保存到 mysql 数据库之前调整图像大小?

PHP 使用 PUT 代替 POST 上传文件

php - 如何在 mysql 中获取最近的行?

php - 内爆php数组并导出到txt会创建重复值

java - Spring hibernate : SQLQuery involving mapped entities

php - 在 PHP 中回答 HTTP_IF_MODIFIED_SINCE 和 HTTP_IF_NONE_MATCH