Похоже, вы делаете свои первые шаги в реляционной базе данных - добро пожаловать в самое интересное!
Я изменил скрипт для явного приведения выражения TRUNC()
к типу DATE в явном виде.
В качестве альтернативы вы также можете использовать функцию TIMESTAMPDIFF()
(например, DATEDIFF()
на SQL сервере).
У нас есть - не только в Vertica, но и во всех СУБД данные типы и функции для тех типов данных, которые значительно упрощают вашу жизнь.
В приведенном ниже примере я использую правильный тип для литерала, подобного '2019-04-27 01:00'
, который представляет собой метку времени без доли секунд, а TIMESTAMP(0)
.
Вы можете получить часть даты временной метки с помощью функции TRUNC(the_timestamp)
, которую я использую ниже.
И в большом количестве RDBMS-ов вы можете вычесть целое даты и получают целые числа как разницу - среди которых Vertica - что я и делаю.
Выбор трех самых последних дат - это выбор даты, упорядочение по убыванию и ограничение результата до 3 строк.
Посмотрите, что я делаю здесь ниже ...
CREATE LOCAL TEMPORARY TABLE xxx(dt, price)
ON COMMIT PRESERVE ROWS AS (
SELECT TIMESTAMP '2019-04-27 01:00', 1
UNION ALL SELECT TIMESTAMP '2019-04-27 02:30', 3
UNION ALL SELECT TIMESTAMP '2019-04-27 18:00', 2
UNION ALL SELECT TIMESTAMP '2019-04-28 17:00', 2
UNION ALL SELECT TIMESTAMP '2019-04-28 21:00', 5
UNION ALL SELECT TIMESTAMP '2019-04-29 17:00',50
UNION ALL SELECT TIMESTAMP '2019-04-29 21:00',10
UNION ALL SELECT TIMESTAMP '2019-04-30 17:00',10
UNION ALL SELECT TIMESTAMP '2019-04-30 21:00',20
UNION ALL SELECT TIMESTAMP '2019-05-01 17:00',40
UNION ALL SELECT TIMESTAMP '2019-05-01 21:00',10
UNION ALL SELECT TIMESTAMP '2019-05-02 17:00',10
UNION ALL SELECT TIMESTAMP '2019-05-02 21:00', 6
)
;
-- GET THE 3 MOST RECENT DATES ...
SELECT
dt
FROM xxx ORDER BY dt DESC
LIMIT 3
;
-- out dt
-- out ---------------------
-- out 2019-05-02 21:00:00
-- out 2019-05-02 17:00:00
-- out 2019-05-01 21:00:00
-- CALCULATE DIFFERENCE IN DAYS BETWEEN THE DATE AND TODAY ..
SELECT
*
, CURRENT_DATE - TRUNC(dt)::DATE AS daydiff_to_today
, TIMESTAMPDIFF(DAY,TRUNC(dt), CURRENT_DATE) AS daydiff_timestampdiff
FROM xxx
ORDER BY 1;
-- out dt | price | daydiff_to_today | daydiff_timestampdiff
-- out ---------------------+-------+------------------+-----------------------
-- out 2019-04-27 01:00:00 | 1 | 366 | 366
-- out 2019-04-27 02:30:00 | 3 | 366 | 366
-- out 2019-04-27 18:00:00 | 2 | 366 | 366
-- out 2019-04-28 17:00:00 | 2 | 365 | 365
-- out 2019-04-28 21:00:00 | 5 | 365 | 365
-- out 2019-04-29 17:00:00 | 50 | 364 | 364
-- out 2019-04-29 21:00:00 | 10 | 364 | 364
-- out 2019-04-30 17:00:00 | 10 | 363 | 363
-- out 2019-04-30 21:00:00 | 20 | 363 | 363
-- out 2019-05-01 17:00:00 | 40 | 362 | 362
-- out 2019-05-01 21:00:00 | 10 | 362 | 362
-- out 2019-05-02 17:00:00 | 10 | 361 | 361
-- out 2019-05-02 21:00:00 | 6 | 361 | 361