postgres를 사용하여 간격을 여러 시간으로 어떻게 변환합니까?


161

같은 간격이 있다고 가정 해보십시오.

4 days 10:00:00

postgres에서. 이것을 여러 시간으로 변환하는 방법 (이 경우 106입니까?) 함수가 있습니까? 아니면 총알을 물고 다음과 같은 작업을 수행해야합니까?

extract(days, my_interval) * 24 + extract(hours, my_interval)

9
참고 : 간격에 월 또는 연도가 포함 된 경우 월 또는 연도의 일 수가 다르므로 시간이 몇 분인지에 대한 정의 된 답변이 없습니다. 그러니 조심해!
Teddy

답변:


314

아마도 가장 쉬운 방법은 다음과 같습니다.

SELECT EXTRACT(epoch FROM my_interval)/3600

6
간격에 분 및 / 또는 초가 포함 된 경우 결과를 플로어 또는 캐스트 할 수 있습니다.
rasjani

64
에포크 추출? 오, 그건 백만 년 동안 내 마음을 넘지 못했을 것입니다.
agnul

5
SELECT EXTRACT (epoch FROM my_interval / 3600) (간격에는 기본 '정수 나누기'지원이 있으며 결과는 간격이며 추출 결과는 부동이 아닌 정수입니다). 그래서. 오토 캐스트 / 플로어 완료
Offenso

19
경고 : 단순히 에포크를 추출하면 1 개월 = 30 일, 1 년 = 365.25 일이라고 암시 적으로 가정합니다.
Teddy

@ 테디 어떻게 할 수 있습니까? 이 문제를 피하고 실제 시대를 얻는 방법?
Asmox

18

정수, 즉 일 수를 원하는 경우 :

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int

큰! 고맙습니다 :) 그러나, 나는 우리가 이것을 하나의 인수 만 사용할 때 자동으로 사용하기 SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400때문에 (Pg 9.4를 사용 하고 있음) 수정할 수 있음을 알았습니다 . age(ts)CURRENT_DATE
1111161171159459134

7
경고 : 단순히 에포크를 추출하면 1 개월 = 30 일, 1 년 = 365.25 일이라고 암시 적으로 가정합니다.
Teddy

3

일 수를 얻는 가장 쉬운 방법은 다음과 같습니다.

SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');

내가 아는 한 다음과 동일하게 반환됩니다.

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;

27
구간이 인 '1 month 0 days'경우를 사용 extract(day from …)하면 0결과가 표시됩니다.
Underyx

1
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));

::int변환 반올림의 원리를 따른다. 반올림과 같은 다른 결과를 원하는 경우와 같은 해당 수학 함수를 사용할 수 있습니다 floor.


1

테이블 필드를 변환하는 경우 :

  1. 초를 포함하도록 필드를 정의하십시오.

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. 값을 추출하십시오. 간격이 크면 불쾌한 놀라움을 얻을 수있는 다른 현명한 캐스트를 기억하십시오 .

    EXTRACT(EPOCH FROM field)::int


Redshift가 INTERVAL 데이터 유형을 지원하지 않는다고 생각합니다. 그냥 큰 것입니다.
matt2000

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.