2010-11-16 62 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