如何将日期时间从默认时区 (IST) 获取到基于不同用户的时区

Ani*_*rya 6 php mysql sql timezone laravel

我在 PHP Laravel 中有这样的查询:

$sensor_data = DB::table('devices_sensor_data as D')
                ->select(DB::raw('
                    D.id,
                    COALESCE(D.DeviceId,dx.DeviceId) AS DeviceId,
                    D.ENERGY_Total,
                    D.Time')
                )

                ->join(DB::raw('
                    (SELECT
                        MIN(CONVERT_TZ(Time, "'.$dbTz.'", "'.$usrTz.'")) min_time,
                        MAX(CONVERT_TZ(Time, "'.$dbTz.'", "'.$usrTz.'")) max_time,
                        DeviceId
                    FROM devices_sensor_data
                    WHERE DATE(Time) BETWEEN "'.$fromTzTime.'" AND "'.$toTzTime.'"
                    AND DeviceId IN (\''.$arrayDeviceID.'\')
                    GROUP BY DATE(Time), DeviceId ORDER BY DATE(Time)
                    ) AS dx'
                ),
                function($join)
                {
                    $join->on(DB::raw('D.Time = `dx`.`min_time` OR D.Time'), '=', 'dx.max_time');
                    $join->where('D.DeviceId', '=', DB::raw('dx.DeviceId'));
                })
                ->whereIn('D.DeviceId', array_keys($devicesArr))
                ->whereDate('D.Time', '>=', $fromTzTime)
                ->whereDate('D.Time', '<=', $toTzTime);

                $sensor_data = $sensor_data
                ->orderBy('D.DeviceId')
                ->orderBy('D.Time')
                ->get();
Run Code Online (Sandbox Code Playgroud)

我想选择MINMAX基于与默认时区不同的基于用户的时区,现在是Asia/Kolkata,所以我想根据例如来选择它。美国/纽约

它根据 IST 时区返回最小值和最大值,然后将其转换为纽约计时,但我想根据纽约时区获取最小值和最大值。

Laj*_*pad 3

您确实需要使用 CONVERT_TZ。让我创建一个示例数据库和数据:

create table MyTimes(
  id int auto_increment primary key,
  moment timestamp
);

insert into MyTimes(moment) values
('2021-01-02 00:00:00'),
('2021-01-01 00:00:00'),
('2021-01-04 00:00:00'),
('2021-01-03 00:00:00');
Run Code Online (Sandbox Code Playgroud)

现在让我们select使用时区转换的最小值和最大值:

select min(convert_tz(moment, '+05:30', '+01:00')) minimum, max(convert_tz(moment, '+05:30', '+01:00')) maximum
from MyTimes;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

小提琴: http: //sqlfiddle.com/#!9/cfca54f /4

现在,让我们看看这个示例中发生了什么:

  • 我们进行选择
  • 返回聚合数据的单个记录
  • 包含最小值和最大值
  • 的时区转换moment
  • 使用convert_tz
  • moment作为第一个参数传递
  • 当前时区作为第二个参数
  • 其目标时区作为第三个参数