Как увеличить дату, используя предыдущее значение из того же столбца, и пропустить дату выходного дня? - PullRequest
0 голосов
/ 01 октября 2019

Я попытался увеличить дату на основе другого столбца даты и пропустить дату выходного дня.

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6

Я знаю, как проверить выходные и как пропустить дату, но я хочу получить результат, как показано ниже

EX. Если я введу дату в одном столбце, например

OriginalDate    
4 October 2019 
5 October 2019
6 October 2019
7 October 2019
8 October 2019
9 October 2019
10 October 2019
11 October 2019
12 October 2019

, тогда я хочу получить результат в новом столбце, например

OriginalDate        UpdatedDate
4 October 2019      4 October 2019 
5 October 2019      7 October 2019 (skip weekend)
6 October 2019      8 October 2019
7 October 2019      9 October 2019
8 October 2019      10 October 2019
9 October 2019      11 October 2019
10 October 2019     14 October 2019 (skip weekend)
11 October 2019     15 October 2019
12 October 2019     16 October 2019

ПРИМЕЧАНИЕ: не пропускайте ни одной строки из даты ввода

Ответы [ 3 ]

0 голосов
/ 01 октября 2019

Это выглядит довольно сложно. Я думаю, что мой лучший совет - восстановить данные. Относительно простой метод использует рекурсивный CTE:

with cte as (
      select min(originaldate) as dte, count(*) as cnt, min(originaldate) as originaldate
      from t
      union all
      select (case when datename(weekday, v.nextdate) = 'Saturday' then dateadd(day, 2, nextdate)
                   when datename(weekday, v.nextdate) = 'Sunday' then dateadd(day, 1, nextdate)
                   else v.nextdate
              end),
             cnt - 1, dateadd(day, 1, originaldate)

      from cte cross apply
           (values (dateadd(day, 1, dte))) v(nextdate)
      where cnt > 0
     )
select originaldate, dte
from cte
order by originaldate;

Здесь - это скрипта db <>.

0 голосов
/ 01 октября 2019

Я создал таблицу календаря для хранения дат и флага «isweekend», затем, исключив даты выходных и упорядочив две таблицы, вы можете объединить их, чтобы получить необходимые данные

use tempdb
GO

-- create a calendar table
drop table if exists #calendar
GO

CREATE TABLE #calendar(
    [date] date
    , isweekend AS (IiF((datename(weekday,[date])) IN ('Saturday', 'Sunday'), 1, 0))
)
--populate with data from 2000 onwards (100000 days)
; with numbers as (
    select ROW_NUMBER() over(order by (select null)) as n from sys.columns o1
    cross join sys.columns o2
)
insert into #calendar ([date]) 
select dateadd(day, numbers.n -1, '20000101') from numbers
where numbers.n < 100000
go

drop table if exists #originaldate
GO

create table #originaldate (
    original date
)
GO
insert into #originaldate (original)
values ('20191004'), ('20191005'), ('20191006'), ('20191007'), ('20191008'), ('20191009'), ('20191010'), ('20191011'), ('20191012'), ('20191013')

select * from #originaldate

GO


; with weekdays as ( -- we only want weekdays, in date order
    select [date], row_number() over (order by [date] asc) as rn
    from #calendar c
    where  c.isweekend = 0
    and date >= '20191004' -- IMPORTANT, you must start row number at the same date as the table you want to match againt
)
, originals as ( -- order the dates we are matching
    select original, ROW_NUMBER() over (order by [original] asc) as rn
    from #originaldate
)
select o.original, w.date as updateddate
from weekdays w
inner join originals o
on o.rn = w.rn
order by o.original ASC
0 голосов
/ 01 октября 2019
SELECT  FORMAT(OriginalDate, 'dd MMMM yyyy')
FROM    dbo.TableName WITH ( NOLOCK )
WHERE   DATENAME(DW, OriginalDate) NOT IN ( 'Sunday', 'Saturday' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...