Làm cách nào để chuyển đổi một khoảng thời gian thành một số giờ với postgres?


161

Nói rằng tôi có một khoảng như

4 days 10:00:00

trong postgres. Làm thế nào để tôi chuyển đổi nó thành một số giờ (106 trong trường hợp này?) Có chức năng hay tôi nên cắn viên đạn và làm một cái gì đó như

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

9
Lưu ý: Nếu khoảng của bạn chứa tháng hoặc năm, không có câu trả lời xác định về số giờ có bao nhiêu, vì số ngày trong một tháng hoặc năm khác nhau. Vì vậy, xem ra cho điều đó!
Teddy

Câu trả lời:


313

Có lẽ cách dễ nhất là:

SELECT EXTRACT(epoch FROM my_interval)/3600

6
Và có thể đặt sàn hoặc chuyển kết quả thành số nguyên nếu khoảng thời gian chứa phút và / hoặc giây
ras camera

64
Trích xuất kỷ nguyên? Ôi trời, điều đó sẽ không còn trong tâm trí tôi trong một triệu năm nữa.
agnul

4
CHỌN EXTRACT (epoch TỪ my_interval / 3600) (khoảng thời gian có hỗ trợ 'chia số nguyên' gốc, kết quả là khoảng và kết quả trích xuất là số nguyên, không nổi). Vì thế. Autocast / Tầng thực hiện.
Offenso

19
Cảnh báo: chỉ cần trích xuất epoch mặc nhiên giả định rằng một tháng = 30 ngày và một năm = 365,25 ngày.
Teddy

@Teddy chúng ta có thể làm gì với nó? Làm thế nào để tránh vấn đề này và có được số lượng kỷ nguyên thực sự?
Asmox

18

Nếu bạn muốn số nguyên tức là số ngày:

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

Tuyệt quá! Cảm ơn bạn vì điều đó :) Tuy nhiên, tôi thấy rằng bây giờ chúng ta có thể sửa đổi điều này thành SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(Tôi đang sử dụng PG 9.4), vì age(ts)tự động sử dụng CURRENT_DATEkhi chỉ có một đối số.
1111161171159459134

7
Cảnh báo: chỉ cần trích xuất epoch mặc nhiên giả định rằng một tháng = 30 ngày và một năm = 365,25 ngày.
Teddy

3

Để có được số ngày, cách dễ nhất là:

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

Theo như tôi biết thì nó sẽ trả về giống như:

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

27
Nếu khoảng của bạn là '1 month 0 days', sử dụng extract(day from …)sẽ cung cấp cho bạn 0như là kết quả.
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));

Việc ::intchuyển đổi tuân theo nguyên tắc làm tròn. Nếu bạn muốn một kết quả khác như làm tròn xuống, bạn có thể sử dụng hàm toán học tương ứng như floor.


1

Nếu bạn chuyển đổi trường bảng:

  1. Xác định trường để nó chứa giây:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Trích xuất giá trị. Hãy nhớ chuyển sang int khôn ngoan khác, bạn có thể nhận được một bất ngờ khó chịu một khi khoảng thời gian là lớn:

    EXTRACT(EPOCH FROM field)::int


Tôi không nghĩ Redshift hỗ trợ kiểu dữ liệu INTERVAL. Nó sẽ chỉ là BIGINT.
matt2000

-4
         select date 'now()' - date '1955-12-15';

Đây là truy vấn đơn giản tính tổng số ngày.


4
Điều đó không mất một giá trị khoảng.
Teddy
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.