Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Postgresql 如果db中的数据有时区偏移,则按天分组和+配对id_Postgresql_Date_Group By_Timestamp_Timezone - Fatal编程技术网

Postgresql 如果db中的数据有时区偏移,则按天分组和+配对id

Postgresql 如果db中的数据有时区偏移,则按天分组和+配对id,postgresql,date,group-by,timestamp,timezone,Postgresql,Date,Group By,Timestamp,Timezone,我有一个服务器,它给我一些信息,这些信息按我使用日期分组。由于时区的原因,我知道我数据库中的2020-06-06 21:00:00实际上是2020-06-07 00:00:00。 我需要计算列meta的和,按tm+pair_id分组,但由于来自数据库的偏移量数据(具有2020-06-06 21:00)tm与其他2020-06-07数据不求和。因此,我没有每天的总量+配对id,而是有几行具有相同的tm和配对id,因为结果中2020-06-06 21:00变为2020-06-07 00:00 我可以

我有一个服务器,它给我一些信息,这些信息按我使用日期分组。由于时区的原因,我知道我数据库中的2020-06-06 21:00:00实际上是2020-06-07 00:00:00。 我需要计算列meta的和,按tm+pair_id分组,但由于来自数据库的偏移量数据(具有2020-06-06 21:00)tm与其他2020-06-07数据不求和。因此,我没有每天的总量+配对id,而是有几行具有相同的tm和配对id,因为结果中2020-06-06 21:00变为2020-06-07 00:00

我可以在不创建子请求的情况下修复此处的分组吗

我有一张桌子:

   CREATE TABLE tests.tbl (
    id int4 NULL,
    tm timestamp NULL,
    meta float4 NULL,
    pair_id int4 NULL
);
有了这些数据:

我的问题是:

SELECT 
    pair_id,
    date_trunc('day', min(tm) at time zone '3' at time zone 'UTC') as tm,
    sum(meta)
FROM tests.tbl
WHERE (tm BETWEEN '2020-06-06 21:00:00+00:00:00' AND '2020-06-08 20:59:00+00:00:00')
group by pair_id, tm
order by tm, pair_id;
我的结果是:

预期结果是:


我认为你想要的逻辑是:

SELECT 
    pair_id,
    date_trunc('day', tm at time zone '3' at time zone 'UTC') as tm,
    sum(meta)
FROM tests.tbl
WHERE tm BETWEEN '2020-06-06 21:00:00+00:00:00' AND '2020-06-08 21:00:00+00:00:00'
GROUP BY 1, 2
ORDER BY 2, 1;
也就是说:select和GROUPBY子句应该特别一致,timestamp列在这两个子句中应该是偏移的

如果将偏移量移动到子查询,可能更容易理解:

SELECT pair_id, date_trunc('day', tm) as tm, sum(meta)
FROM (
    SELECT 
        pair_id,
        tm at time zone '3' at time zone 'UTC' as tm,
        meta
    FROM tests.tbl
) t
WHERE tm >= '2020-06-07'::date AND tm < '2020-06-09'::date
GROUP BY 1, 2
ORDER BY 2, 1;

第一个查询有错误的结果-总和是9和13,因此它与2020-06-06 21:00的总和不符。第二个有正确的结果,但它是子查询。。。顺便问一下,“1,2分组”是什么意思?这里的1和2是什么?列数?@Mitch:1和2指SELECT子句中的列数。例如,在第二个查询中,1是pair_id,2是date_trunc'day',tm。谢谢,以前从未使用过这个。在您的第一个查询中,在'2020-06-06 21:00:00+00:00:00'和'2020-06-08 21:00:00+00:00:00'之间更改为'tm',并且它似乎可以正常工作。请在此处添加'2020-06-08 21:00+00:00:00'以便于开箱操作