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,则无论如何都应该可以。