рассчитать, как получить GETDATE () -4, используя функцию клиента в SQL - PullRequest
0 голосов
/ 23 марта 2020

У меня есть функция в моей базе данных, которая может выдавать рабочую дату, например, так ...

Скажем, сегодня 3/23/2020 - если я запускаю функцию следующим образом:

select [dbo].[ufGetBusinessDay] (DATEADD(day, -1,GETDATE()) ,'PREVIOUS') 

будет отображаться '03 / 20/2020 '(предыдущий рабочий день. Он пропускает выходные)

, если я сделаю что-то вроде

select [dbo].[ufGetBusinessDay] (DATEADD(day, +1,GETDATE()) ,'NEXT') 

покажет '03 / 24/2020 '(следующий рабочий день)

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

Моя цель - создать фильтр в профайле c, который позволит мне go вернуться на 4 дня обратно так ...

Select * from tbl1 where DateField >=DATEADD(dd,-4,GETDATE()) and DateField < GETDATE()

проблема с функцией заключается в том, что она уходит только на день назад, так что пока это работает в этом сценарии, потому что наша последняя рабочая дата - пятница - 4 days

DECLARE @daysago AS DATETIME

SELECT @daysago= [dbo].[ufGetBusinessDay] (DATEADD(day, -1,GETDATE()),'PREVIOUS') 

SELECT DATEADD(DAY,-4,@daysago)

Однако в случае сканарио, где GETDATE () является средой, и я запускаю функцию, которая вернется во вторник, а если мы сделаем DATEADD(DAY,-4,TUESDAY), она вернется в воскресенье. Цель здесь состоит в том, чтобы использовать эту функцию, чтобы исключить выходные и фактически go обратно в четверг предыдущей недели.

РЕДАКТИРОВАТЬ: Я даже не уверен, что это можно сделать внутри хранимого про c используя эту функцию. Я думаю, что на самом деле может быть необходимо создать отдельную pro c или функцию для такого рода вещей, когда мы проверяем DATENAME (WEEKDAY, DATE), чтобы определить, выходной ли это, и затем используем функцию, которую я должен go назад. до предыдущего рабочего дня (исключая выходные) с учетом того, сколько дней назад мы уже провели.

1 Ответ

1 голос
/ 23 марта 2020

Вы должны иметь возможность вложить несколько вызовов вашей функции вместе в go назад количество рабочих дней, которое вы хотите.

select 
[dbo].[ufGetBusinessDay] (DATEADD(day, -1, 
    [dbo].[ufGetBusinessDay] (DATEADD(day, -1, 
        [dbo].[ufGetBusinessDay] (DATEADD(day, -1, 
            [dbo].[ufGetBusinessDay] (DATEADD(day, -1, GETDATE()), 'PREVIOUS'), 
        'PREVIOUS'), 
    'PREVIOUS'), 
'PREVIOUS')

Вы также можете использовать общее табличное выражение (CTE) для рекурсивного Вызовите вашу функцию нужное количество раз, а затем выберите только одно значение, как это.

DECLARE @XDaysAgo DATE;
DECLARE @NumberBusinessDays INT;
SET @NumberBusinessDays = -1;

WITH cte AS
(
    SELECT 0 AS DaysBack, [dbo].[ufGetBusinessDay] (DATEADD(day, -1, GETDATE(), 'PREVIOUS')) AS MyDate
    UNION ALL
    SELECT
          cte.DaysBack - 1
        , [dbo].[ufGetBusinessDay] (DATEADD(day, -1, cte.MyDate, 'PREVIOUS'))
    FROM  cte
    WHERE cte.DaysBack > @NumberBusinessDays
)
SELECT @XDaysAgo = cte.MyDate 
FROM cte WHERE cte.DaysBack = @NumberBusinessDays;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...