SQL Server: упорядочение по дате в будущем, когда год неизвестен - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть эта информация из таблицы: день и месяц даты (например, 16/11 для 16 ноября) событий, которые повторяются каждый год.

Мне нужно создать вид, отсортированный по тому, как далеко он будет в будущем.

(например, если в настоящее время это 16 ноября 2010 года, то 31/12 означает 31 декабря 2010 года, а до 1/1 означает 1 января 2011 года)

Давайте предположим, что в таблице событий есть эти 3 столбца

|------------------------|
|         Event          |
|------------------------|
| ID | DueDay | DueMonth |
|------------------------|

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

Ответы [ 4 ]

2 голосов
/ 16 ноября 2010
SELECT ID, DueDay, DueMonth
FROM Event
ORDER BY
    CASE WHEN DueMonth > DATEPART(month, GETDATE())
              OR (
                     DueMonth = DATEPART(month, GETDATE())
                     AND DueDay >= DATEPART(day, GETDATE())
                 )
         THEN 0 ELSE 1 END,
    DueMonth,
    DueDay
1 голос
/ 16 ноября 2010

Любое событие в таблице с указанием дня / месяца взносов перед текущим днем ​​/ месяцем произойдет * в этом * году.Любое событие с должным днем ​​/ месяцем за текущим днем ​​/ месяцем произойдет следующий год.Любое событие, которое должно произойти в следующем году, является более продолжительным, чем любое событие, которое должно произойти в этом году.

Теперь, когда говорится, то, что вы просите, невозможно, потому что вы просите ...a View, sorted by..., то есть концепции, которой не существует. Просмотры не отсортированы .Только запросы отсортированы.Таким образом, вы можете создать представление, которое проецирует правильную дату события, а затем запрос из представления должен использовать ORDER BY , чтобы отсортировать события по дате события:

create table Events (
 id int identity(1,1) not null, 
 DueDay int not null, 
 DueMonth int not null);
go

insert into Events (DueDay, DueMonth) 
values  (1,1), (15,11), (31,12);
go

create view eventsDate as
select id, dateadd(day, DueDay-1,
  dateadd (month, DueMonth-1,
     dateadd(year, 
         case when DueMonth < month(getdate()) or
            (DueMonth = month(getdate()) and 
             DueDay < day(getdate()))
         then year(getdate())-1899
         else year(getdate())-1900 end, 
         '19000101'))) as DueDate
    from Events;

Чтобы получитьсобытия по порядку, запрос должен включать порядок по:

select * from eventsDate order by DueDate desc;
1 голос
/ 16 ноября 2010

Оцените день и месяц по сравнению с текущей датой - если она больше текущей даты (исключая год), установите ее на текущий год, в противном случае установите на текущий год + 1.

Select id, dueday, duemonth, 
    CASE WHEN duedate||duemonth||datepart(yy, getdate()) > getdate() 
        then duedate||duemonth||datepart(yy, getdate()) 
        else duedate||duemonth||dateadd(yy, 1, datepart(yy, getdate())) as fullDate
from event
order by fullDate

Извините за синтаксис - проверить его нечего :(, вы должны понять это.

В идеале вы хотите хранить столбец меток времени или иметь дополнительную часть года.

0 голосов
/ 16 ноября 2010

Единственный способ сделать это, если вы всегда предполагаете, что даты находятся в текущем году, если срок исполнения / срок выполнения более поздний, чем текущий, и в следующем году, если срок исполнения / срок выполнения предшествуеттекущая дата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...