将day,weeknr和year转换为date

时间:2015-09-23 08:14:34

标签: sql-server excel date ssis script-component

我收到了一份excel文档,其中注明了工作时间信息,本文档包含在Visual Studio中使用SSIS读取的某些列,之后将信息写入数据库。

周和年列包含周数和年份,从星期一到星期五的列包含有关在一周中某一天某个任务花费了多少工时的信息。

我想做的是参加WeekNr,Year和Day并将它们转换为日期。我一直试图通过使用脚本组件来实现这一目标,该组件将日期编号,周数和年份转换为日期,但到目前为止,我还无法从列中获取日期编号。在我看来,如果用一个开始日期和结束日期作为该周的第一个和最后一个日期,它将最有效。

所以我的问题是,如果有人知道如何实现这一点,或者我应该尝试不同的方法。

脚本组件:

     public override void Input0_ProcessInputRow(Input0Buffer Row, CultureInfo cultureInfo, int day )
{

    DateTime firstDayOfYear = new DateTime(Int32.Parse(Row.Jaar), 1, 1);
    int firstWeek = cultureInfo.Calendar.GetWeekOfYear(firstDayOfYear, cultureInfo.DateTimeFormat.CalendarWeekRule, cultureInfo.DateTimeFormat.FirstDayOfWeek);
    int dayOffSet = day - (int)cultureInfo.DateTimeFormat.FirstDayOfWeek + 1;
    Row.TaskDates = firstDayOfYear.AddDays((Int32.Parse(Row.Week) - (firstWeek + 1)) * 7 + dayOffSet + 1);



}

1 个答案:

答案 0 :(得分:0)

根据this answer,我认为您需要以下内容。此结果为您提供星期一的日期,因此您可以根据一周中的列日来AddDays

DateTime jan1 = new DateTime(Int32.Parse(Row.Jaar), 1, 1);
int daysOffset = DayOfWeek.Monday - jan1.DayOfWeek;

DateTime firstMonday = jan1.AddDays(daysOffset);
var cal = CultureInfo.CurrentCulture.Calendar;

int firstWeek = cal.GetWeekOfYear(firstMonday, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday);

var weekNum = Int32.Parse(Row.Week);
if (firstWeek <= 1)
{
    weekNum -= 1;
}
var mondaysDate = firstMonday.AddDays(weekNum * 7);
var tuesdaysDate = mondaysDate.AddDays(1);