Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:如何按时间戳搜索,但首先转换时区?_Php_Mysql - Fatal编程技术网

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

Php MySQL:如何按时间戳搜索,但首先转换时区?,php,mysql,Php,Mysql,我需要能够得到每月或每天花费的总金额。要做到这一点,我需要sum(tblaccounts.amountin),但问题是我需要将date列转换为不同的时区。我尝试过使用转换(日期,“+00:00”,“+10:00”),但不知道如何使用之类的。 在第一次转换时间戳时,如何根据$period变量获取每月或每天的记录? 类似于WHERE convert_tz(date)的东西,比如$date\u到\u check% function check_limit($period='monthlylimit'

我需要能够得到每月或每天花费的总金额。要做到这一点,我需要
sum(tblaccounts.amountin)
,但问题是我需要将
date
列转换为不同的时区。我尝试过使用
转换(日期,“+00:00”,“+10:00”)
,但不知道如何使用
之类的


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

类似于
WHERE convert_tz(date)的东西,比如$date\u到\u 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 . "%'";
}

利用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 ."'";
正确的时区号,也取决于您的默认值,以及您想要的结果。你可能得摆弄那个号码


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

$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 ."'";

注意:我在这里没有像
那样使用
,因为这就是为什么我引入了
DATE\u格式
,将其设置为一个单独的值进行比较。

利用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 ."'";
正确的时区号,也取决于您的默认值,以及您想要的结果。你可能得摆弄那个号码


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

$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 ."'";

注意:我在这里没有像
那样使用
,因为这就是为什么我引入了
DATE\u格式
将其设置为单个值进行比较。

您应该将其存储到表中作为UTC,然后将范围的时间转换为UTC进行查询。修正每条记录的时间戳而不仅仅是一个值是非常浪费的。@DaveS我将它们存储为UTC,但此查询需要进行转换。我说的是在将其提供给查询之前,先在PHP中进行fix$date\u to\u检查。如果已经是UTC,那么MySQL就不需要转换。我会同意Dave的建议,让时间与数据库中已经存在的时间相匹配。但就我个人而言,这就是为什么我将时间存储为unix时间戳int,而不是datetime字段;)日期-时间字段更为详细,也更易于使用。如果您将所有日期存储为UTC,您应该不会有问题。您应该将日期存储为UTC,然后将范围内的时间转换为UTC进行查询。修正每条记录的时间戳而不仅仅是一个值是非常浪费的。@DaveS我将它们存储为UTC,但此查询需要进行转换。我说的是在将其提供给查询之前,先在PHP中进行fix$date\u to\u检查。如果已经是UTC,那么MySQL就不需要转换。我会同意Dave的建议,让时间与数据库中已经存在的时间相匹配。但就我个人而言,这就是为什么我将时间存储为unix时间戳int,而不是datetime字段;)日期-时间字段更为详细,也更易于使用,如果您将所有日期存储为UTC,则无论如何都应该可以。