#sql #sql-server #linq #linq-to-sql
#sql #sql-сервер #linq #linq-to-sql
Вопрос:
У меня есть база данных событий, каждое из Time
полей, которые необходимо отсортировать в порядке возрастания с указанного времени. «День» для этих событий начинается в 11:00 вечера (события происходят 24 часа в сутки с 11:00 вечера до 10:59 вечера).
Есть ли способ отсортировать мои события так, чтобы результаты начинались с событий 11:00 вечера, 11: 01 вечера, …, 11: 59 вечера, прежде чем переходить к событиям 12:00 утра? Если бы примеры могли быть предоставлены как в SQL, так и в LINQ to SQL, это было бы здорово.
Редактировать: я должен объяснить название моего вопроса. Моя первоначальная идея состояла в том, чтобы просто добавлять час к каждому времени во время сортировки, но при этом возвращаемое значение по-прежнему должно быть исходным временем. Это привело бы к тому, что все события 11: 00 вечера и т.д. Теперь были бы событиями 12: 00 утра и т.д., А все остальное было бы перенесено на час вперед (последние события дня в 10: 59 вечера теперь будут происходить в 11: 59 вечера для целей сортировки). Возможно ли это?
Комментарии:
1. При запросе вам просто нужны данные за определенный «день»?
2. ДА. События повторяются каждый день, и поэтому в таблице действительно указан только один день.
3. Немного мелочей: 11 вечера — это начало полуночи в древнекитайском исчислении времени (на самом деле 11 вечера — 1 час ночи следующего дня — это первый «час»). Каждый древнекитайский «час» соответствует 2 западным «часам». Интересно, делаете ли вы что-нибудь с древнекитайским хронометражем?
4. Нет. Дни для этого проекта начинаются в 11 вечера.
Ответ №1:
Для заданного набора раз сортировка в порядке возрастания даст тот же результат, что и сортировка (время 1 час) в порядке возрастания. Порядок набора значений не меняется, когда к каждому добавляется постоянное значение (по крайней мере, в этом и других простых случаях).
Вам дополнительно нужно группировать по компоненту даты или извлекать по дате? Я чувствую, что, возможно, ваша проблема заключается в том, как группировать или выбирать (время 1 час), а не сортировать.
Комментарии:
1. События повторяются каждый день, поэтому в базе данных есть только один день событий.
Ответ №2:
Не уверен, что это наиболее эффективный способ, но я думаю, что это то, о чем вы просите.
declare @theDateYouAreInterestedIn smalldatetime
-- this gets today's date and subtracts an hour giving you 11:00pm yesterday
-- if you want it some other date just sub out the Cast(GetDate() as date) for the
-- desired date
set @theDateYouAreInterestedIn = Dateadd(hour, -1,Cast(Cast(GetDate() as date) as smalldatetime))
select *
from yourTable
where yourDateTimeField > @theDateYouAreInterestedIn
and yourDateTimeField < Dateadd(day, 1,@theDateYouAreInterestedIn)
order by yourDateTimeField