ฉันจะสร้างอนุกรมเวลาใน PostgreSQL ได้อย่างไร


9

หากคุณต้องการสร้างชุดข้อมูลวันที่ให้ดูคำถามนี้

สมมติว่าฉันต้องการสร้างชุดข้อมูลทุก 5 นาทีเป็นเวลา 24 ชั่วโมง ฉันจะทำเช่นนั้นใน PostgreSQL ได้อย่างไร

PostgreSQL สามารถgenerate_series()จากแต่ไม่ได้มาจากtimestamptime

มันจะดีกว่าถ้าเลือก timestamp ตามอำเภอใจหรือมีวิธีอื่นในการสร้างซีรีส์?

คำตอบ:


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เพื่อสร้าง min-offset จาก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 แต่ก็มีอีกตัวเลือก -

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

บางครั้งจะใช้ได้ในบางสถานที่เท่านั้น มันเป็นเรื่องของ DST borking ดูคำตอบของฉันที่นี่สำหรับข้อมูลเพิ่มเติม
Evan Carroll

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.