2010-11-16 46 views
0

我從表中得到以下信息:每年重複發生的事件日期和月份(例如11月16日的16/11)。SQL Server:按未來日期排序,未知年份

我需要創建一個視圖,按照它在將來的距離排序。

(例如,如果它是目前2010 11月16日,然後31/12指2010年12月31說到這意味着2011 1月1日之前1/1)

假設事件表有這3列

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

在此先感謝!

+1

您是否只計劃持有最多一年的數據? – 2010-11-16 00:10:23

+0

是的,表可能是錯的。謝謝大家的所有優秀答案! – Aximili 2010-11-16 04:06:05

回答

1

表中的任何事件會在當前日/月之前提前一天發生* this * year。任何在當天/月之後到期日/月的事件將發生下一個年。明年到期的任何活動比今年任何活動都要多。

現在說,你要求的是不可能的,因爲你要求...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; 
+0

如果您投票,解釋原因 – 2010-11-16 00:52:24

1

評估與當前日期相比的日期和月份 - 如果它大於當前日期(不包括年份),則將其設置爲當前年份,否則將其設置爲當前年份+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

您可以這樣做的唯一方法是,如果您始終假定如果到期日/到期月份是當前日期之後的日期是當年,並且如果到期日/到期月份是在當前日期之前

2
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