#sql-server #ssis
#sql-server #ssis
Вопрос:
У меня есть еженедельные папки, созданные вручную в моей системе один раз в неделю, куда файлы будут перемещены сюда. Теперь мы хотим автоматизировать эту задачу с помощью SSIS.
Ниже приведены структуры папок за сентябрь месяц
MY16 МЫ 04 СЕНТЯБРЯ 16
MY16 МЫ 11 СЕНТЯБРЯ 16
MY16 МЫ 18 СЕНТЯБРЯ 16
MY16 МЫ 25 СЕНТЯБРЯ 16
Я имею в виду маркетинговый год, МЫ указываем неделю.
Теперь нам нужно создать папки для месяца октября на 2, 9, 16, 23, 30 и на ближайшие месяцы.
MY16 МЫ 2 октября 16
..
..
как написать выражение / функцию для этого.
Ответ №1:
Предполагая, что учитывается дата текущего дня и выписка в день недели, затем переместите день в конец недели;
сначала вам нужно ввести две переменные для day of week (@[User::DayOfWeek] int32) и month (@[User::VariableMonth] Строка), предполагающая вычисление месяца и года в последний день недели:
@[User::DayOfWeek]
DATEPART( "dw", getdate() ) == 1 ? 6
: DATEPART( "dw", getdate() ) == 2 ? 5
: DATEPART( "dw", getdate() ) == 3 ? 4
: DATEPART( "dw", getdate() ) == 4 ? 3
: DATEPART( "dw", getdate() ) == 5 ? 2
: DATEPART( "dw", getdate() ) == 6 ? 1
: 0
@[User::VariableMonth]
(MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 1 ? "JAN" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 2 ? "FEB" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 3 ? "Mar" :
MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 4 ? "APR" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 5 ? "MAY" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 6 ? "JUN" :
MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 7 ? "JUL" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 8 ? "AUG" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 9 ? "SEP" :
MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 10 ? "OCT" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 11 ? "NOV" : MONTH(DATEADD( "DD", @[User::DayOfWeek], getdate() )) == 12? "DEC":"")
выражение, которое вам нужно:
"MY" RIGHT((DT_WSTR,4) YEAR(DATEADD( "DD", @[User::DayOfWeek], getdate() )),2) " WE " @[User::VariableMonth] " " RIGHT( "0" (DT_WSTR,2) DAY(DATEADD( "DD", @[User::DayOfWeek], getdate() ) ),2) " " RIGHT((DT_WSTR,4) YEAR(DATEADD( "DD", @[User::DayOfWeek], getdate() )),2)
Результат с помощью getdate()
MY16 WE OCT 23 16
Я надеюсь, что это поможет.
Вы также можете объединить все переменные в одну, но это сложно понять и отобразить.
Комментарии:
1. это действительно помогло, но в моем выражении вместо 23 октября я получаю дату как 22 октября. я не совсем понимаю выражение, используемое в @DayOfWeek, поскольку значение текущего дня должно быть 4, где выражение as выдает 3, где после моей даты значение меняется на 22 октября вместо 23 октября.
2. Вероятно, есть другая запись по умолчанию, когда неделя начинается в воскресенье, можете ли вы сказать мне, что возвращает DW, рассчитанный в воскресенье, с вашими настройками? Должно быть 1.
3. Да, это возвращает 1
4. Мы могли бы использовать обходной путь, чтобы изменить настройку DayOfWeek. Как вы предпочитаете связывать свои дни? К следующему воскресенью или к предыдущему воскресенью?
5. до следующего воскресенья