Как автоматизировать изменение даты в запросе, используя Transact SQL - PullRequest
0 голосов
/ 20 июня 2019

Я работаю в компании, где каждый день я изменяю запрос, меняя дату предыдущего дня, потому что отчет всегда за предыдущий день. Я хочу автоматизировать изменение даты. Я сделал таблицу с двумя столбцами, один со всеми датами этого года, а другой с битами, где если 0 - рабочий день, а 1 - выходной.

Я успешно автоматизировал немного, сказав, что предыдущий день - рабочий день, затем вычтите 1 из даты (это происходит каждый день). Но проблема в том, что если понедельник будет выглядеть как пятница, потому что суббота и воскресенье не оплачиваются. И скажем также, что если сегодня четверг, среда и вторник, мы праздники, то отчет будет опубликован в понедельник. Я оставлю вам картинку, которая показывает, как таблица составлена ​​с датами.

Помня, что если в середине недели нет праздников, всегда будет вычитаться один.

the image is not updated because I took it from a group

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Способ сделать подобные вещи близок к тому, что вы сделали, но просто расширьте его дальше. Создайте таблицу BusinessDate, в которой есть каждая дата, а затем каждое правило, которое вы внедрили в нее. Вы можете зайти так далеко, что включите столбец, такой как ReportDate, который будет возвращать для каждой даты дату, для которой должен выполняться отчет.

Сделайте это один раз, и это будет работать вечно больше. Возможно, вам придется обновляться для будущих праздников один раз в год, но лучше, чем раз в день!

Это также позволит вам обновлять данные, специфичные для вашего бизнеса, такие как квартальные даты, корпоративные праздники и т. Д.

Если вы хотите узнать больше об этой теме, найдите темы, касающиеся создания измерения даты в хранилище данных. Это та же самая общая проблема, с которой вы сталкиваетесь.

0 голосов
/ 20 июня 2019

Слишком сложно для комментария и требует много догадок.

Итак, каждый день ваш процесс начинается с определения того, является ли «сегодня» рабочим днем.Таким образом, вы должны сделать что-то вроде:

if exists (select * from <calendar> where date = cast (getdate() as date) and IsWorkday = 1")
begin
    <do stuff> 
end; 

В разделе «делать вещи» будет затем запустить отчет или ваш запрос (или что-то, что не очень ясно), используя самый последний рабочий день до текущейДата.Вы находите эту дату, используя что-то вроде:

declare @targetdate date; 
set @targetdate = (select max(date) from <calendar> 
    where date < cast (getdate() as date) 
    and IsWorkday = 1); 

if @targetdate is not null 
   <run your query using @targetdate>

Это может быть сжато в меньшем количестве кода, но это легче понять, когда логика написана пошагово.

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