Postgresql 转换为小时
Postgresql Convert to hours
我有一个可用的滞后函数,但我需要它来 return 小时差。当我尝试日期差异函数时,我感到很困惑。任何帮助表示赞赏。谢谢
Select
well_id,
reported_date,
lag (reported_date,1) over (
partition by well_id
order by well_id
) AS hour_rate
from
public.production;
使用EXTRACT(EPOCH FROM age(...))
然后计算小时数:
SELECT well_id, reported_date,
(EXTRACT(EPOCH FROM age(reported_date,
LAG(reported_date) OVER w))/3600)::int
FROM production
WINDOW w AS (PARTITION BY well_id ORDER BY reported_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW);
演示:db<>fiddle
CREATE TABLE production (well_id int, reported_date date);
INSERT INTO production VALUES
(1,CURRENT_DATE-1),(1,CURRENT_DATE),(1,CURRENT_DATE+2),
(2,CURRENT_DATE-5),(2,CURRENT_DATE-6),(2,CURRENT_DATE-8);
SELECT
well_id,
reported_date,
age(reported_date,LAG(reported_date) OVER w),
coalesce((
EXTRACT(EPOCH FROM age(reported_date,LAG(reported_date) OVER w))/3600)::int,0) AS hour_rate
FROM production
WINDOW w AS (PARTITION BY well_id ORDER BY reported_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
ORDER BY well_id,reported_date;
well_id | reported_date | age | hour_rate
---------+---------------+--------+-----------
1 | 2021-08-26 | | 0
1 | 2021-08-27 | 1 day | 24
1 | 2021-08-29 | 2 days | 48
2 | 2021-08-19 | | 0
2 | 2021-08-21 | 2 days | 48
2 | 2021-08-22 | 1 day | 24
(6 rows)
我有一个可用的滞后函数,但我需要它来 return 小时差。当我尝试日期差异函数时,我感到很困惑。任何帮助表示赞赏。谢谢
Select
well_id,
reported_date,
lag (reported_date,1) over (
partition by well_id
order by well_id
) AS hour_rate
from
public.production;
使用EXTRACT(EPOCH FROM age(...))
然后计算小时数:
SELECT well_id, reported_date,
(EXTRACT(EPOCH FROM age(reported_date,
LAG(reported_date) OVER w))/3600)::int
FROM production
WINDOW w AS (PARTITION BY well_id ORDER BY reported_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW);
演示:db<>fiddle
CREATE TABLE production (well_id int, reported_date date);
INSERT INTO production VALUES
(1,CURRENT_DATE-1),(1,CURRENT_DATE),(1,CURRENT_DATE+2),
(2,CURRENT_DATE-5),(2,CURRENT_DATE-6),(2,CURRENT_DATE-8);
SELECT
well_id,
reported_date,
age(reported_date,LAG(reported_date) OVER w),
coalesce((
EXTRACT(EPOCH FROM age(reported_date,LAG(reported_date) OVER w))/3600)::int,0) AS hour_rate
FROM production
WINDOW w AS (PARTITION BY well_id ORDER BY reported_date
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
ORDER BY well_id,reported_date;
well_id | reported_date | age | hour_rate
---------+---------------+--------+-----------
1 | 2021-08-26 | | 0
1 | 2021-08-27 | 1 day | 24
1 | 2021-08-29 | 2 days | 48
2 | 2021-08-19 | | 0
2 | 2021-08-21 | 2 days | 48
2 | 2021-08-22 | 1 day | 24
(6 rows)