MySQL:我如何按时间戳搜索但首先转换时区?

时间:2018-02-07 21:07:26

标签: php mysql

我需要能够每月或每天花费总金额。要做到这一点,我会sum(tblaccounts.amountin),但我遇到的问题是我需要将date列转换为不同的时区拳头。我曾尝试弄乱convert_tz(date,"+00:00","+10:00"),但不确定如何将其与LIKE一起使用。

在首次转换时间戳时,如何根据$period变量获取每月或每日的记录?

WHERE convert_tz(date) LIKE $date_to_check%

这样的东西
function check_limit($period='monthlylimit') {

    if ($period == 'monthlylimit') {
        $date_to_check = date("Y-m");
    }
    else { ### Day period
        $date_to_check = date("Y-m-d");
    }

    $select = "SELECT
        sum(tblaccounts.amountin) as amountin
    FROM tblaccounts
    WHERE date LIKE '" . $date_to_check . "%'";
}

1 个答案:

答案 0 :(得分:2)

利用mysql中的时区更改,这应该可以解决:

if ($period == 'monthlylimit') {
    $date = date('Ym');
    $format = '%Y%m';
} else {
    $date = date('Ymd');
    $format = '%Y%m%d';
}
$sql = "SELECT SUM(t.amountin) as amountin FROM tblaccounts t WHERE 
        DATE_FORMAT(CONVERT_TZ(t.date,'+00:00','+10:00'),'". $format ."') = '". $date ."'";

正确的时区编号将取决于您拥有的mysql默认值以及您想要的结果。你可能不得不扭曲这个数字。

或者您可以在php侧更改日期的时区并跳过mysql tz转换:

$dt = new DateTime("now", new DateTimeZone($tz));// $tz to equal what you are aiming for
$dt->setTimestamp(time());// might not be needed
if ($period == 'monthlylimit') {
    $date = $dt->format('Ym');
    $format = '%Y%m';
} else {
    $date = $dt->format('Ymd');
    $format = '%Y%m%d';
}
$sql = "SELECT SUM(t.amountin) as amountin FROM tblaccounts t WHERE 
        DATE_FORMAT(t.date,'". $format ."') = '". $date ."'";

注意:我在这里没有使用LIKE,因为这就是我引入DATE_FORMAT将其设置为单个值进行比较的原因。