Làm cách nào để tạo chuỗi thời gian trong PostgreSQL?


9

Nếu bạn đang tìm cách tạo một chuỗi ngày, hãy xem câu hỏi này

Giả sử tôi muốn tạo một chuỗi trong mỗi 5 phút trong 24 giờ. Làm thế nào để tôi làm điều đó trong PostgreSQL?

PostgreSQL có thể generate_series()từ một timestamp, nhưng không phải từ time.

Là tốt hơn để chọn một dấu thời gian tùy ý, hoặc có một cách khác để tạo ra chuỗi?

Câu trả lời:


14

Để tối ưu hóa:

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

Ngày không liên quan, vì vậy sử dụng hằng số dấu thời gian tùy ý. Các diễn viên timerất rẻ.
Điều này bao gồm giới hạn dưới và trên, vì vậy chúng tôi nhận được '00:00' hai lần . Sử dụng '2000-01-01 23:59'như giới hạn trên để có được nó một lần duy nhất.

Liên quan:


Tôi tìm thấy một cái gì đó về ngày tùy ý là rất xấu. Nhưng, tôi đã nghĩ rằng trên thực tế nó sẽ nhanh hơn và tốt hơn.
Evan Carroll

Vì ngày là không liên quan, nó cũng có thể là tùy ý. Đó là cách nhanh nhất.
Erwin Brandstetter

6

Không chắc đây có phải là cách tốt nhất hay không, nhưng chúng ta có thể sử dụng generate_seriesđể tạo ra phần bù trừ từ 00:00:00đó và sau đó chỉ cần gọi make_interval(mins=>)để lấy khoảng từ nó.

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

5

Tôi thích cách @EvanCarroll, nhưng một tùy chọn khác -

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

Điều này sẽ chỉ hoạt động đôi khi trong một số nơi. Đó là đối tượng của DST borking. Xem câu trả lời của tôi ở đây để biết thêm thông tin.
Evan Carroll

3

Cách khác:

SELECT '00:00:00'::time + x * '1 minute'::interval
FROM generate_series(0, 60*24, 5) AS t(x);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.