代码之家  ›  专栏  ›  技术社区  ›  Aximili

SQL Server:在不知道年份的将来按日期排序

  •  0
  • Aximili  · 技术社区  · 14 年前

    我从一张表格中得到这个信息:每年重复发生的事件的到期日(如11月16日的16/11)。

    我需要创建一个视图,按它在未来的距离排序。

    (例如,如果当前是2010年11月16日,则31/12表示2010年12月31日,1/1之前表示2011年1月1日)

    假设事件表有这3列

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

    提前谢谢!

    4 回复  |  直到 14 年前
        1
  •  1
  •   Remus Rusanu    14 年前

    表中任何在当前日期/月之前的日期/月的应付款事件将在*年*月*日发生。任何到期日/月晚于当前日/月的事件都将发生 下一个 一年。明年到期的任何事件比今年到期的任何事件都要长。

    既然如此,你所要求的是不可能的,因为你所要求的是 ...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;
    

    要按顺序获取事件,查询必须包含order by:

    select * from eventsDate order by DueDate desc;
    
        2
  •  2
  •   LukeH    14 年前
    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
    
        3
  •  1
  •   Mr Shoubs    14 年前

    评估与当前日期相比的日期和月份-如果大于当前日期(不包括年份),则将其设置为当前年份,否则将其设置为当前年份+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
    

    很抱歉语法-没有什么可以测试的:(,但是你应该知道。

    理想情况下,您希望存储一个时间戳列,或者在一年中有一个额外的部分。

        4
  •  0
  •   Ryan Guill    14 年前

    唯一的方法是,如果到期日/到期月在当前日期之后,则始终假设日期在当前年份;如果到期日/到期月在当前日期之前,则始终假设日期在下一年。