PostgreSQL에서 시계열을 어떻게 생성합니까?


9

날짜 시리즈를 생성하려는 경우이 질문을 참조하십시오.

24 시간 동안 5 분마다 시리즈를 생성한다고 가정 해 보겠습니다. PostgreSQL에서 어떻게합니까?

PostgreSQL은 generate_series()에서 가능 timestamp하지만에서 가능하지는 않습니다 time.

임의의 타임 스탬프를 선택하는 것이 좋습니까, 아니면 시리즈를 생성하는 다른 방법이 있습니까?

답변:


14

최적화하려면 :

SELECT x::time
FROM   generate_series(timestamp '2000-01-01 00:00'
                     , timestamp '2000-01-02 00:00'
                     , interval  '5 min') t(x);

날짜는 관련이 없으므로 임의의 타임 스탬프 상수를 사용하십시오. 캐스트 time는 매우 저렴합니다.
여기에는 하한과 상한이 포함되므로 '00:00' 두 번습니다 . '2000-01-01 23:59'한 번만 얻으려면 상한으로 사용하십시오 .

관련 :


나는 임의의 날짜에 대해 아주 못생긴 것을 발견했습니다 . 그러나 실제로 그것이 더 빠르고 더 좋을 것이라고 생각했습니다.
Evan Carroll

날짜는 관련이 없으므로 임의 일 수도 있습니다. 가장 빠른 방법입니다.
Erwin Brandstetter

7

이것이 최선의 방법인지 확실하지 않지만 generate_series최소 오프셋을 생성 00:00:00한 다음 호출 make_interval(mins=>)하여 간격을 얻을 수 있습니다.

SELECT make_interval(mins=>x)::time
FROM generate_series(0, 60*24-5, 5) AS t(x);

5

@EvanCarroll way를 좋아했지만 또 다른 옵션-

select  x::time
from    generate_series 
            (current_date,current_date + '1 day - 1 second'::interval,'5 minute') as t(x);

이것은 때때로 어떤 곳에서만 작동합니다. DST 보킹이 적용됩니다. 자세한 내용은 여기답변 을 참조하십시오.
Evan Carroll

3

또 다른 방법:

SELECT '00:00:00'::time + x * '1 minute'::interval
FROM generate_series(0, 60*24, 5) AS t(x);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.