У меня есть следующая структура данных.
Таблица:
CalendarEvents
CalendarEventRepetition
CalendarEventID
Понедельник (бит)
вторник (бит)
Среда (бит)
четверг (бит)
Пятница (бит)
Суббота (бит)
Воскресенье (бит)
EveryNWeek int
EndAfterNOccurences int
Все значения datetimeoffset являются значениями UTC по отношению к DateTime.MIN и используются только для вычисления значений времени.
Мне нужно иметь возможность возвращать предстоящие события CalendarEvents, отсортированные по времени их начала с СЕГОДНЯ. Это требует вычисления параметра ORDER BY. Я никогда не выполнял пользовательскую сортировку t-sql, и любые входные данные были бы очень благодарны.
В доменной логике я делал следующее для вычисления SoonestOccurrence для еженедельных событий:
DateTime startTime = System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId(e.FromDate.LocalDateTime, TimeZone);
foreach(CalendarEvent e in events)
{
DateTime endTime = System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId(e.ToDate.LocalDateTime, TimeZone);
DateTime now = System.TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, TimeZone);
//clear time component
now = new DateTime(now.Year, now.Month, now.Day);
DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), b.Day.SelectedValue);
int nextWeekDaysAdjustment = (int) day - (int)now.DayOfWeek;
if (nextWeekDaysAdjustment < 0)
{
nextWeekDaysAdjustment+=7;
}
DateTime adjustedStartTime = startTime.AddDays(nextWeekDaysAdjustment);
adjustedStartTime = now.AddTicks(adjustedStartTime.Ticks);
//SoonestOccurrence is a field added in a partical class for CalendarEvent entity
e.SoonestOccurrence = adjustedStartTime;
}
Проблема в том, что я не могу выполнить эту сортировку в памяти, потому что мне нужно иметь возможность распечатать этот запрос и добавить к нему другой набор данных, возвращенный функцией NearestAccounts (), поэтому я застрял.
Заранее благодарю за помощь.
Обновление: мне нужно будет ввести идентификатор часового пояса или смещение часового пояса, чтобы настроить GetDate () для вычислений, а также все времена начала сохраняться в UTC.