2016-07-20 4 views
1

Мне нужен SQL-запрос, который позволил бы мне показать, сколько дней осталось для обработки счета-фактуры, этот запрос должен указывать время, оставшееся до авторизации котировок, до автоматического аннулирования, которое составляет 14 дней для не обработанных и 7 дней для частичной обработки.Рассчитать оставшиеся дни использования в SQL Server

Может ли кто-нибудь мне помочь?

Например. если бы котировка пришла сегодня, она должна показать 14 дней, завтра 13 дней и т. д.

+1

Я думаю, что вы ищете для 'lateiff()' – HoneyBadger

+0

@HoneyBadger Можете ли вы показать мне, как я мог бы это сделать, я новичок в языке sql –

ответ

0

Вы не предоставили данные, так что вот пример, основанный на фиктивных данных. Как уже упоминалось в комментариях, вам необходимо использовать функцию DATEDIFF. Но прежде чем вы узнаете количество дней между датами, вы должны добавить 14 к дате счета-фактуры с помощью функции DATEADD. Это даст вам обратный отсчет эффекта вам нужно:

;WITH invoices AS (
SELECT 1 as invoice_num, 
     '2016-07-10' as invoice_date, 
     1 as invoice_status 
UNION ALL 
SELECT 2, 
     '2016-07-01', 
     1 
UNION ALL 
SELECT 3, 
     '2016-07-12', 
     2 
UNION ALL 
SELECT 4, 
     '2016-07-18', 
     2 
), invoice_statuses AS (
SELECT 1 as invoice_status, 
     'un-processed' as status_description 
UNION ALL 
SELECT 2, 
     'partially processed' 
) 


SELECT i.invoice_num, 
     i.invoice_date, 
     s.status_description, 
     DATEDIFF(day,GETDATE(),DATEADD(day, 
      CASE WHEN i.invoice_status = 1 THEN 14 
       WHEN i.invoice_status = 2 THEN 7 
       ELSE 0 END 
          ,i.invoice_date)) as days_left 
FROM invoices i 
LEFT JOIN invoice_statuses s 
    ON s.invoice_status = i.invoice_status 

выход будет:

invoice_num invoice_date status_description days_left 
1   2016-07-10  un-processed  4 
2   2016-07-01  un-processed  -5 
3   2016-07-12  partially processed -1 
4   2016-07-18  partially processed 5 

Если изменить GETDATE() на 2016-07-21 выходе будет:

invoice_num invoice_date status_description days_left 
1   2016-07-10  un-processed  3 
2   2016-07-01  un-processed  -6 
3   2016-07-12  partially processed -2 
4   2016-07-18  partially processed 4 
0

Как упомянуто комментарии, это можно легко достичь с помощью функции DATEDIFF:

DECLARE @InvoiceDate DATE = '2016-08-01'; 
SELECT DATEDIFF(DAY, GETDATE(), @InvoiceDate); 
0

получить дату отмены, вам нужна первоначальная дата или 7, или 14 дней, оставшимися (в зависимости от статуса)

вот пример

declare @datStart as date = '2016-07-15'; --an initial start date 
declare @proc as nvarchar(1) = 'U'; --unprocessed 

--this would give a final process ing date 
SELECT case when @proc ='U' THEN DATEADD(DAY, 14, @datStart) ELSE DATEADD(DAY, 7, @datStart) END 

--this gives you days unil the delete date 
SELECT datediff(day,getdate(), case when @proc ='U' THEN DATEADD(DAY, 14, @datStart) ELSE DATEADD(DAY, 7, @datStart) END) 
Смежные вопросы