如何从php中的数据库中获取上个月的数据?

时间:2014-05-15 22:29:25

标签: php date mysqli

我正在开发一个php网站,需要从上个月获取一些数据。不仅是上个月的第一个月而且是过去五个月的数据我很困惑,我怎么能这样做?在我的数据库中,我创建了两列。一个是"月"另一个是"年"。所以行看起来像


id ---- text ---- month ---- year

1 ----你好---- 5月----- 2014

2 ---- hi ---- May ----- 2014


现在我可以使用这样的date()函数来获取数据。

$first_month = date('F', strtotime('-1 month'));
$second_month = date('F', strtotime('-2 month'));
$third_month = date('F', strtotime('-3 month'));

五个月,我可以创建五个变量。但是一年?我的意思是,如果当前月份是2014年1月和2014年,那么我将需要从2013年12月获取数据,那么它将如何运作?谁能建议我?

我很困惑。请告诉我是否有人之前做过这样的事情。我需要想法或概念。

3 个答案:

答案 0 :(得分:1)

您可以重构表以使用Unix时间戳或MySQL date,并选择使用比较器。或者你可以创建临时表并执行相同的操作。

您前进的方向对维护和调试来说非常重要。此外,正确的查询将比我相信您期望的更复杂。例如,跨越多年将与上述一行。虽然许多线路都是你的方式。

编辑:要维护当前逻辑,SQL Select语句必须是一系列WHERE。例如:

SELECT * FROM table
WHERE
    (month IN ('April', 'May') AND year = 2014)

将选择2014年4月和5月的月份。

以下将跨越一年:

SELECT * FROM table
WHERE
    (month IN ('December') AND year = 2013)
OR
    (month IN ('January') AND year = 2014)

从程序角度来看,您需要生成一个包含年份和月份的数组,包括您想要选择的一年中的所有月份。

这种数组的结构如下所示:

// For the first example
$where1 = array(
    2014 => array(
        'April',
        'May'
    )
);

// For the second example
$where2 = array(
    2013 => array(
        'December'
    ),
    2014 => array(
        'January'
    )
);

您必须从这些数组中创建WHERE子句。如:

/**
 * Outputs
 * [where1] (month IN ('April', 'May') AND year = 2014)
 *
 * [where2] (month IN ('December') AND year = 2013) OR (month IN ('January') AND year = 2014)
 */
foreach(array('where1','where1') as $where_name) {

    $clause = '';

    $where = $$where_name;

    $wheres = array();

    foreach($where as $year => $months) {
        $wheres[] = "month IN ('" . implode("', '", $months) . "') AND year = $year";
    }

    $clause = '('.implode (') OR (', $wheres).')';

    echo "[$where_name] $clause\n\n";
}

这应该可以解决问题。有一个工作示例here。收集月份列表几乎与您一直相同,但更像是这样:

    list($month, $year) = explode(" ", date('F Y', strtotime('-3 month')));

var_dump($month); // February
var_dump($year); // 2014

$array[$year][] = $month; // Will create the array structure as above

有更有效的方法,但这是一般的想法。我相信我已经给你留下了一些有趣的工具来解决你的问题。

要使这个范围达到一个范围,你需要做一些事情:

$where3 = array();

for ($prev_months = 1; $prev_months <= 5; $prev_months++) {
    list($month, $year) = explode(" ", date('F Y', strtotime("-$prev_months month")));
    $where3[$year][] = $month;
}

您可以在此处查看工作示例: http://ideone.com/UWI5wI

供参考,以下是使用您的方法与已接受的规范的示例:

// your last and 5
(month IN ('April', 'March', 'February', 'January') AND year = 2014) OR (month IN ('December') AND year = 2013)

// native 1 and 5
date <= 2014-05-01 01:00:00 AND date > 2013-12-01 01:00:00

我使用了第一个(这不是惯例),因为每个月都有第一个。您可能希望使用目标月份的最后一天,而不是下个月的第一天,但​​是您可以使用它。

跨越很长一段时间,差异更明显:

// 2 years, yours
(month IN ('April', 'March', 'February', 'January') AND year = 2014) OR (month IN ('December', 'November', 'October', 'September', 'August', 'July', 'June', 'May', 'April', 'March', 'February', 'January') AND year = 2013) OR (month IN ('December', 'November', 'October', 'September', 'August', 'July', 'June', 'May') AND year = 2012)

// The conventional way is still just two comparators...

答案 1 :(得分:0)

MySQL日期格式为YYYY-MM-DD HH:MM:SS

或(获取一个月前的日期格式):

date("Y-m-d H:i:s",strtotime("-1 month"));

您应该在新数据上发布已创建的(时间戳/日期时间)列,并只搜索此数据。

通过创建月,日,年列并尝试将其分开,您只会让自己变得更难。

答案 2 :(得分:0)

如果你想保留你的桌面结构,你可以使用你拥有的内容:

$month = date('F', strtotime('-6 month'));
$year = date('Y', strtotime('-6 month'));

将在11月和2013年为您提供

不确定您要存储的数据类型,但另一种选择可能是根据年份命名您的表格,然后每个月都有列

表名:year_2014

 id----m1---m2---m3 etc...
 1----hello
 2----hi
 3----Hey

然后你的查询将是:

$month = date("n", strtotime('-6 month'));
$year = date('Y', strtotime('-6 month'));
$monthval = "m" + $month;
$SQL = "SELECT " . $monthval . " FROM year_".$year;

SELECT m11 FROM year_2013