Есть ли способ написать выражение DateAdd и DatePart SSIS, чтобы всегда генерировать дату ThisWeekMonday с помощью Getdate()?

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

Я попытался использовать следующее выражение, но оно сгенерировало дату понедельника прошлой недели, когда оно запускается в понедельник:

DATEADD( "dd", -1 - (DATEPART("dw", GETDATE()) + 4) % 7, GETDATE()  ).

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

Кто-то дал мне это выражение, но оно вообще не работало для понедельника даже после изменения параметров:

DATEADD( "dd", (DATEPART( "dw", GETDATE() )  -3), GETDATE()  )  

Наконец, я попытался использовать следующий оператор, который эквивалентен оператору Case в SQL, но он дал мне ошибку в первой части каждой строки, показанной ниже (ПРИМЕЧАНИЕ: квадратные скобки не были включены).

[  DATEPART( "dw", GETDATE())  ] 

Смотрите мое полное выражение ниже:

DATEPART( "dw", GETDATE())  == 1 ?  DATEADD( "dd", 1, GETDATE()) : (
DATEPART( "dw", GETDATE())  == 2 ?  DATEADD( "dd", 0, GETDATE()) : (
DATEPART( "dw", GETDATE())  == 3 ?  DATEADD( "dd", -1, GETDATE()) :  (
DATEPART( "dw", GETDATE())  == 4 ?  DATEADD( "dd", -2, GETDATE()) :  (
DATEPART( "dw", GETDATE())  == 5 ?  DATEADD( "dd", -3, GETDATE()) :  (
DATEPART( "dw", GETDATE())  == 6 ?  DATEADD( "dd", -4, GETDATE()) :  (
DATEPART( "dw", GETDATE())  == 7 ?  DATEADD( "dd", -5, GETDATE()) ))))))

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

Заранее спасибо.


person Sast77    schedule 03.07.2019    source источник


Ответы (1)


Используйте следующее выражение:

DateAdd("dd", 2 - DatePart("dw", GetDate()) , GetDate()) 

Чтобы объяснить, 2 (это понедельник) - любой другой день недели дает вам смещение дня, которое можно добавить к текущему дню.

например 2 (понедельник) - 6 (пятница) = -4, поэтому добавление -4 дней к пятнице дает вам понедельник.

Надеюсь это поможет.

person CyberCyclist    schedule 03.07.2019
comment
Извиняюсь за поздний ответ, так как был в отпуске. Я проверил вашу формулу, и она сработала идеально. Также спасибо за объяснение, так как я просто не мог понять, как работает DateAdd. Таким образом, при разбивке, если я прав, смещение, определенное (2 - DatePart(dw, GetDate())), добавляется обратно к текущей дате, полученной последним выражением GetDate(), что возвращает его к понедельнику каждую неделю. Очень умно сделано. И огромное спасибо за вашу помощь. - person Sast77; 16.07.2019