Получить количество дней между 2 датами в одном столбце в SQL

#sql #oracle #date

#sql #Oracle #Дата

Вопрос:

Цель: определить записи, в которых разница в дате вступления в силу между 2 транзакциями превышает 365 дней.

Пример таблицы:

 account#    Effective_Date
1234        01/01/2020
1234        02/01/2020
1234        03/01/2020
1234        04/01/2021
  

Я хотел бы создать таблицу, которая будет выглядеть следующим образом

 account     Effective_Date  Effective_Date_1   Calculate_Days
1234        01/01/2020                         0  
1234        02/01/2020      01/01/2020         31
1234        03/01/2020      02/01/2020         29
1234        04/01/2021      03/01/2020         395
  

цель 1: дублировать дату вступления в силу в другом столбце «effective_date_1»
цель 2: смещение «effective_date_1» на 1 строку

возможно ли это в SQL?

Комментарии:

1. Да, это так. Какую СУБД вы используете? Это очень просто в современных СУБД, которые имеют LAG функцию.

2. Используйте LAG() функцию.

3. Пожалуйста, пометьте свой вопрос базой данных, которую вы используете: mysql, oracle, sqlserver …?

Ответ №1:

Использовать lag() . В SQL Server это выглядит так:

 select t.*,
       datediff(day, lag(effective_date), effective_date) as num_days
from t;
  

Примечание: это возвращает NULL для первой строки. Если вы действительно хотите 0 , то форма с 3 аргументами удобна:

 select t.*,
       datediff(day, lag(effective_date, 1, effective_date), effective_date) as num_days
from t;
  

Ответ №2:

оператор lag должен использовать с over() и order by в нем.

 select t.*
    ,lag(Effective_Date) over(order by Effective_Date)
    ,datediff(day, lag(Effective_Date) over(order by Effective_Date) , Effective_Date)
from (
    select  1234  as account#      ,'01/01/2020' as Effective_Date
    union
    select  1234  as account#      ,'02/01/2020' as Effective_Date
    union
    select  1234  as account#      ,'03/01/2020' as Effective_Date
    union
    select  1234  as account#      ,'04/01/2021' as Effective_Date
) t