Postgres ile bir aralığı birkaç saate nasıl dönüştürebilirim?


161

Diyelim ki bir aralığım var

4 days 10:00:00

postgres. Bunu birkaç saate nasıl dönüştürebilirim (bu durumda 106?) Bir işlev var mı veya mermiyi ısırmalı ve benzer bir şey yapmalıyım

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

9
Not: Aralığınız ay veya yıl içeriyorsa, bir ay veya yıldaki gün sayısı değiştiği için kaç saat olduğu konusunda belirli bir cevap yoktur. Öyleyse dikkat et!
Teddy

Yanıtlar:


314

Muhtemelen en kolay yol:

SELECT EXTRACT(epoch FROM my_interval)/3600

6
Aralık dakika ve / veya saniye içeriyorsa Ve belki zemin veya tamsayıya sonucu döküm
rasjani

64
Dönem ayıklamak? Ah benim, bu bir milyon yıl içinde aklımı geçemezdi.
agnul

5
EXTRACT SEÇİMİ (my_interval / 3600'DEN ÇAĞ) (aralık yerel 'bölme tamsayısı' desteğine sahiptir, sonuç aralıktır ve çıkarma sonucu tam sayıdır, kayan değil). Yani. Autocast / Döşeme bitti.
Offenso

19
Uyarı: Çağı dolaylı bir şekilde çıkarmak, bir ay = 30 gün ve bir yıl = 365.25 gün olduğunu varsayar.
Teddy

@Teddy bununla ne yapabiliriz? Bu sorundan nasıl kaçınılır ve gerçek sayıda dönem nasıl alınır?
Asmox

18

Tamsayı istiyorsanız, yani gün sayısı:

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

Harika! Bunun için teşekkür ederim :) Yine de, şimdi SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400(Pg 9.4 kullanıyorum) olarak değiştirebileceğimizi buldum , çünkü sadece bir argüman olduğunda age(ts)otomatik olarak kullanıyorum CURRENT_DATE.
1111161171159459134

7
Uyarı: Çağı dolaylı bir şekilde çıkarmak, bir ay = 30 gün ve bir yıl = 365.25 gün olduğunu varsayar.
Teddy

3

Gün sayısını elde etmek için en kolay yol:

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

Bildiğim kadarıyla aynı dönecekti:

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

28
Eğer aralığınız ise '1 month 0 days', kullanmak sonucu extract(day from …)size verecektir 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));

::intDönüşüm yuvarlama ilkesini takip eder. Yuvarlama gibi farklı bir sonuç istiyorsanız, karşılık gelen matematik işlevini kullanabilirsiniz floor.


1

Tablo alanını dönüştürürseniz:

  1. Alanı saniye içerecek şekilde tanımlayın:

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Değeri ayıklayın. İnt döküm unutmayın aralıkları büyük bir kez bilge tatsız bir sürpriz alabilirsiniz diğer:

    EXTRACT(EPOCH FROM field)::int


Redshift'in INTERVAL veri tipini desteklediğini düşünmüyorum. Sadece BIGINT olurdu.
matt2000

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

İşte toplam gün sayısını hesaplayan basit sorgu.


4
Bu bir aralık değeri almaz.
Teddy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.