Postgtres: подсчитать количество дней как поплавок с учетом часов / минут - PullRequest
2 голосов
/ 26 февраля 2020

Я хотел бы вычислить количество дней с 1899/12/30, принимая во внимание количество часов и минут.

Так, например, данные в моей таблице:

+--------------------+-------------+
|     dob            |    n_days   |
+--------------------+-------------+
|1980-08-09 13:34:10 |  29442.5654 |
|2005-12-15 23:10:00 |  38701.6528 |
|2020-02-26 15:56:00 |  43887.6639 |
+--------------------+-------------+

Запрос:

SELECT DATE_PART('day', dob -'1899-12-30 00:00:00'::TIMESTAMPTZ) AS n_days 
FROM my_date;

Возвращает только количество дней:

n_days
---------
29441
38701
43887

1 Ответ

3 голосов
/ 26 февраля 2020

Рассмотрим:

extract(epoch from dob - '1899-12-30 00:00:00'::timestamptz) / 60 / 60 / 24

Обоснование:

  • вычитание метки времени дает interval, представляющее разницу между метками времени

  • extract(epoch from ...) превращает это в количество секунд

  • все, что осталось сделать, это разделить на количество секунд, которое есть в дне

Демонстрация на DB Fiddle :

with t as (
    select '1980-08-09 13:34:10'::timestamptz dob
    union all select '2005-12-15 23:10:00'::timestamptz
    union all select '2020-02-26 15:56:00'::timestamptz
)
select 
    dob,
    extract(epoch from dob - '1899-12-30 00:00:00'::timestamptz) / 60 / 60 / 24 as n_days
from t
dob                    | n_days            
:--------------------- | :-----------------
1980-08-09 13:34:10+01 | 29442.52372685185 
2005-12-15 23:10:00+00 | 38701.965277777774
2020-02-26 15:56:00+00 | 43887.66388888889 
...