Как использовать MILLISECOND с date_add и date_diff - PullRequest
0 голосов
/ 18 марта 2019

Я немного застрял, пытаясь использовать MILLISECOND с функцией date_add в большом запросе:

Я пытаюсь использовать этот SQL, который не работает для меня

DATE_ADD(MILLISECOND,-1,LEAD(dt) OVER (PARTITION BY xy ORDER BY dt ASC)

, также ищу решение дляDATE_DIFF функция

Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

DATE_ADD требуется date_part в качестве аргумента. Для этого вы можете использовать DATATIME_ADD . Это работает для меня:

DATETIME_ADD(LEAD(validfrom) OVER (PARTITION BY xy ORDER BY validfrom ASC), INTERVAL -1 MILLISECOND) as validto

Игра с некоторыми фиктивными данными:

WITH test_table as
(
    SELECT 1 AS xy, CURRENT_DATETIME() AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 1 MINUTE ) AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 2 MINUTE ) AS validfrom UNION ALL
    SELECT 1 AS xy, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 3 MINUTE ) AS validfrom
)
SELECT
  *,
  DATETIME_ADD(LEAD(validfrom) OVER (PARTITION BY xy ORDER BY validfrom ASC), INTERVAL -1 MILLISECOND) as validto
FROM test_table;

Это результат:

Row xy  validfrom                   validto  
1   1   2019-03-18T15:06:18.086840  2019-03-18T15:07:18.085840   
2   1   2019-03-18T15:07:18.086840  2019-03-18T15:08:18.085840   
3   1   2019-03-18T15:08:18.086840  2019-03-18T15:09:18.085840   
4   1   2019-03-18T15:09:18.086840  null    

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

1 голос
/ 18 марта 2019

Это рабочий пример использования DATETIME_ADD

SELECT *, DATETIME_DIFF(seq_date,LEAD_DT, HOUR) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATETIME_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 HOUR) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATETIME() as seq_date, 10 as cost
union ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -10 MINUTE ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL -1 HOUR ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATETIME_ADD(CURRENT_DATETIME(), INTERVAL 5 HOUR ) as seq_date, 20 as cost));

Это рабочий пример использования DATE_ADD

SELECT *, DATE_DIFF(seq_date,LEAD_DT, DAY) FROM  
(SELECT *, RANK() OVER (PARTITION BY ID ORDER BY seq_date) AS RNK,
DATE_ADD((LEAD(seq_date) OVER (PARTITION BY ID ORDER BY seq_date)) ,INTERVAL 3 DAY) LEAD_DT
FROM 
(select 1 as id, CURRENT_DATE() as seq_date, 10 as cost
union ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -10 DAY ) as seq_date, 12 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY ) as seq_date, 13 as cost
UNION ALL
select 1 as id, DATE_ADD(CURRENT_DATE(), INTERVAL 5 DAY ) as seq_date, 20 as cost));

Для более подробной информации см. Ниже ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...