вычислить разницу во времени дат последовательных строк в SQL

#sql

#sql

Вопрос:

Здравствуйте, я пытаюсь вычислить разницу во времени в 2 последовательных строках для даты (в часах или днях), как показано на изображении, выделенном желтым цветом, — это результат, который я хочу, который в основном представляет собой разницу даты в этой строке и 1 выше. Как мы можем добиться этого в SQL? Прилагается мой сложный код, в котором есть остальные поля

введите описание изображения здесь

 with cte 
as
(

select m.voucher_no, CONVERT(VARCHAR(30),CONVERT(datetime, f.action_Date, 109),100) as action_date,f.col1_Value,f.col3_value,f.col4_value,f.comments,f.distr_user,f.wf_status,f.action_code,f.wf_user_id 
from attdetailmap m
LEFT JOIN awftaskfin f ON f.oid = m.oid and f.client ='PC'
where f.action_Date !=''  and action_date between '$?datef' and '$?datet'

),
.*select *, ROW_NUMBER() OVER(PARTITION BY action_Date,distr_user,wf_Status,wf_user_id order by action_Date,distr_user,wf_Status,wf_user_id ) as row_no_1 from cte

cte2 as 
(
select *, ROW_NUMBER() OVER(PARTITION BY voucher_no,action_Date,distr_user,wf_Status,wf_user_id order by voucher_no ) as row_no_1 from cte 
)
select distinct(v.dim_value) as resid,c.voucher_no,CONVERT(datetime, c.action_Date, 109) as action_Date,c.col4_value,c.comments,c.distr_user,v.description,c.wf_status,c.action_code,  c.wf_user_id,v1.description as name,r.rel_value as pay_office,r1.rel_value as site

from cte2  c 

LEFT OUTER JOIN aagviuserdetail v ON v.user_id = c.distr_user
LEFT OUTER JOIN aagviuserdetail v1 ON v1.user_id = c.wf_user_id
LEFT OUTER JOIN ahsrelvalue r ON r.resource_id = v.dim_Value and r.rel_Attr_id = 'P1' and r.period_to = '209912'
LEFT OUTER JOIN ahsrelvalue r1 ON r1.resource_id = v.dim_Value and r1.rel_Attr_id = 'Z1' and r1.period_to = '209912'

where c.row_no_1 = '1'  and r.rel_value like '$?site1' and voucher_no like '$?trans' 

order by voucher_no,action_Date
  

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

1. Пометьте свой вопрос базой данных, которую вы используете.

Ответ №1:

Ключевая идея заключается lag() в следующем . Однако функции даты и времени различаются в разных базах данных. Итак, идея заключается в:

 select t.*,
       (date - lag(date) over (partition by transaction_no order by date)) as diff
from t;
  

Я должен отметить, что этот точный синтаксис может не работать в вашей базе данных — потому - что может даже не быть определен для значений даты / времени. Однако lag() это стандартная функция и она должна быть доступна.

Например, в SQL Server это будет выглядеть так:

 select t.*,
       datediff(second, lag(date) over (partition by transaction_no order by date), date) / (24.0 * 60 * 60) as diff_days
from t;
  

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

1. Я добавил свой сложный код. Вы заметите, что в нем уже есть некоторые разделы. Вы рекомендуете установить его где-нибудь там?

2. Дайте мне знать, если вы можете предложить что-то в моем существующем коде

3. Ответ Гордона здесь является хорошим ответом на вопрос (на основе предоставленной исходной структуры). Для определения местоположения я предлагаю поместить его в ваш окончательный выбор после c.voucher_no,CONVERT(datetime, c.action_Date, 109) as action_Date того, как они кажутся соответствующими полями. Однако я замечаю, что c.action_date — это VARCHAR, а не поле datetime. Это означает, что сортировка (и, следовательно, ЗАДЕРЖКА) будет неправильной. В худшем случае вам нужно будет преобразовать его в datetime как часть ЗАДЕРЖКИ; лучше обновить свой код, чтобы избежать выполнения 3-полосных преобразований, которые вы делаете.