Интервалы дат в Postgresql не показывают правильные результаты

При выполнении этого запроса:

SELECT  start_date,
        end_date,
        extract(epoch from end_date::timestamp - start_date::timestamp)/(24*60*60) as total,
        extract(epoch from end_date::timestamp - GETDATE()::timestamp)/(24*60*60) as left

FROM    app_data.content_cards

Я получаю таблицу, как это:

+---------------------+---------------------+-------+-------+
| start_date          | end_date            | total | left  |
+---------------------+---------------------+-------+-------+
| 2017-03-30 22:00:00 | 2017-04-07 22:00:00 | 8     | -9.89 |
+---------------------+---------------------+-------+-------+
| 2017-04-09 22:00:00 | 2017-04-11 22:00:00 | 2     | -5.89 |
+---------------------+---------------------+-------+-------+
| 2017-04-03 22:00:00 | 2017-04-11 22:00:00 | 8     | -5.89 |
+---------------------+---------------------+-------+-------+
| 2017-03-30 22:00:00 | 2017-04-18 22:00:00 | 19    | 1.11  |
+---------------------+---------------------+-------+-------+
| 2017-04-09 22:00:00 | 2017-04-15 22:00:00 | 6     | -1.89 |
+---------------------+---------------------+-------+-------+
| 2017-04-02 22:00:00 | 2017-05-20 22:00:00 | 78    | 63.11 |
+---------------------+---------------------+-------+-------+
| 2017-04-23 22:00:00 | 2017-04-29 22:00:00 | 6     | 12.11 |
+---------------------+---------------------+-------+-------+
| 2017-04-02 22:00:00 | 2017-05-20 22:00:00 | 78    | 63.11 |
+---------------------+---------------------+-------+-------+

Но если я использую этот запрос:

SELECT  start_date,
        end_date,
        end_date - start_date as total,
        end_date - GETDATE() as days

FROM    app_data.content_cards

Я получаю таблицу, как это:

+--------------------+-------------------+-------+-----------------+
| start_date         | end_date          | total | left            |
+--------------------+-------------------+-------+-----------------+
|2017-03-30 22:00:00 |2017-04-07 22:00:00|8 days |-9 days -21:21:47|
+--------------------+-------------------+-------+-----------------+
|2017-04-09 22:00:00 |2017-04-11 22:00:00|2 days |-5 days -21:21:47|
+--------------------+-------------------+-------+-----------------+
| 2017-04-03 22:00:00|2017-04-11 22:00:00|8 days |-5 days -21:21:47|
+--------------------+-------------------+-------+-----------------+
| 2017-03-30 22:00:00|2017-04-18 22:00:00|19 days|1 day 02:38:13   |
+--------------------+-------------------+-------+-----------------+
| 2017-04-09 22:00:00|2017-04-15 22:00:00|6 days |-1 days -21:21:47|
+--------------------+-------------------+-------+-----------------+
| 2017-04-02 22:00:00|2017-05-20 22:00:00|48 days|33 days 02:38:13 |
+--------------------+-------------------+-------+-----------------+
| 2017-04-23 22:00:00|2017-04-29 22:00:00|6 days |12 days 02:38:13 |
+--------------------+-------------------+-------+-----------------+
| 2017-04-02 22:00:00|2017-05-20 22:00:00|48 days|33 days 02:38:13 |
+--------------------+-------------------+-------+-----------------+

Обратите внимание на разные результаты в строках 1 и 3, начиная снизу. Правильный должен быть тот, который возвращает последний запрос.

Мне нужно иметь результаты в днях и с двумя десятичными знаками (как в первой таблице), но с правильными данными (как во второй). Кроме того, мне нужны данные, чтобы в результате не было "дней", просто нужно значение с двумя десятичными знаками.

Как мне этого добиться?

Я использую: версию PostgreSQL 8.0.2 на i686-pc-linux-gnu, скомпилированную GCC GCC (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.1232

1 ответ

Этот запрос должен работать для вас.

select  start_date,
        end_date,
        (date_part(epoch,end_date)::float- date_part(epoch,start_date)::float)/(24*60*60) as total,
        (date_part(epoch,end_date)::float- date_part(epoch,sysdate)::float)/(24*60*60) as total left        
from    app_data.content_cards

ИЛИ ЖЕ
Вы также можете использовать свою функцию извлечения.

SELECT  start_date, 
        end_date, 
        (extract(epoch from end_date)::float - extract(epoch from start_date)::float)/(24*60*60) as total,
        (extract(epoch from end_date)::float - extract(epoch from sysdate)::float)/(24*60*60) as left
FROM    app_data.content_cards

Если я сделал неверное предположение, пожалуйста, прокомментируйте, и я перефокусирую свой ответ.

Другие вопросы по тегам