ฉันจะแปลงช่วงเวลาเป็นจำนวนชั่วโมงด้วย postgres ได้อย่างไร


161

บอกว่าฉันมีช่วงเวลาเหมือน

4 days 10:00:00

ในภายหลัง ฉันจะแปลงให้เป็นจำนวนชั่วโมง (106 ในกรณีนี้ได้อย่างไร) มีฟังก์ชั่นหรือฉันควรกัดกระสุนและทำสิ่งที่ชอบ

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

9
หมายเหตุ: หากช่วงเวลาของคุณมีเดือนหรือปีไม่มีคำตอบที่กำหนดไว้ว่ามีกี่ชั่วโมงเนื่องจากจำนวนวันในหนึ่งเดือนหรือปีแตกต่างกันไป ดังนั้นระวังให้ดี!
เท็ดดี้

คำตอบ:


314

อาจเป็นวิธีที่ง่ายที่สุดคือ:

SELECT EXTRACT(epoch FROM my_interval)/3600

6
และอาจพื้นหรือโยนผลให้จำนวนเต็มถ้าช่วงมีนาทีและ / หรือวินาที
rasjani

64
แยกยุคหรือไม่ โอ้ฉันจะไม่ข้ามความคิดของฉันไปกว่าล้านปี
agnul

5
SELECT EXTRACT (ช่วงเวลาจาก my_interval / 3600) (ช่วงเวลามีการสนับสนุน 'หารจำนวนเต็ม' แบบดั้งเดิมผลลัพธ์คือช่วงเวลาและผลลัพธ์การแยกเป็นจำนวนเต็มไม่ใช่แบบลอย) ดังนั้น. Autocast / Floor Done
Offenso

19
คำเตือน: เพียงการแยกช่วงเวลาโดยนัยจะถือว่าหนึ่งเดือน = 30 วันและหนึ่งปี = 365.25 วัน
เท็ดดี้

@ เท็ดดี้เราสามารถทำอะไรกับมันได้บ้าง วิธีหลีกเลี่ยงปัญหานี้และรับจำนวนยุคที่แท้จริงได้อย่างไร
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
คำเตือน: เพียงการแยกช่วงเวลาโดยนัยจะถือว่าหนึ่งเดือน = 30 วันและหนึ่งปี = 365.25 วัน
เท็ดดี้

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;

28
หากช่วงเวลาของคุณคือการ'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.