【问题标题】:SQL order by Month, Day closest to now按月、日最近的 SQL 排序
【发布时间】:2011-08-22 04:09:12
【问题描述】:

我正在写一份声明,以提取最快到期的帐户。我的查询目前按月和日排序,因为年份无关紧要。无论如何将当前月份和日期设置为最高值?而不是 1 月 1 日?

SELECT *
FROM clients
WHERE LiveDate IS NOT NULL
Order by DATEPART(month, LiveDate), DATEPART(day, LiveDate)

我是否只需将其拆分为两个查询,一个在当前月份之后查找,一个在之前查找,然后加入它们以使它们处于正确的顺序

示例:

date founded || Annual function
01/01/2011   || beach outing
11/03/2010   || family day
23/03/2009   || Movies
05/04/2000   || Girls night out
10/05/2005   || Cricket function
29/07/2011   || candle lit formal dining
30/07/2008   || childrens day
04/08/2005   || board games day
03/012/2006  || pizza night
20/012/2001  || camping trip

因为这是一年一度的郊游,所以这一年并不重要。我想按照最接近现在到年底的事件的顺序来拉它们,然后是从年初到今天。

因此结果将根据当前日期按以下顺序排列:2011 年 6 月 23 日

date founded || Annual function 
29/07/2011   || candle lit formal dining 
30/07/2008   || childrens day 
04/08/2005   || board games day 
03/012/2006  || pizza night 
20/012/2001  || camping trip              _ _ _ _ _ _ _ New year _ _ _ _ _  
01/01/2011   || beach outing 
11/03/2010   || family day 
23/03/2009   || Movies 
05/04/2000   || Girls night out 
10/05/2005   || Cricket function

【问题讨论】:

  • 好吧,您自己的建议可能已经足够了。但是您需要使用 UNION,而不是 JOIN 进行 2 个查询。
  • 我不确定我是否完全理解你的意思。您想在当前日期之后返回由LiveDate 订购的客户吗?因为您问题下方的评论表明您还希望在当前日期之前获得客户。当前日期为 12 月 31 日时会发生什么?
  • 我想按顺序退回明年从今天到昨天的所有客户。我想我会像 Petr 纠正我那样使用工会。它有效。
  • 不,不是因为它在最后订购。不在每个选择中。我可能只需要运行两个查询。

标签: sql sql-server datetime date sql-order-by


【解决方案1】:

如果您不想要历史结果,只需添加以下内容:

WHERE LiveDate >= GETDATE()...

【讨论】:

    【解决方案2】:
    SELECT *
    FROM clients
    WHERE LiveDate IS NOT NULL
    ORDER BY ABS(DATEDIFF(day, LiveDate, GETDATE())
    

    更新

    对不起,一开始没有明白排序时只考虑与当前日期和月份的接近度,而不是年份。

    所以可能是这样的:

    SELECT *
    FROM clients
    WHERE LiveDate IS NOT NULL
    ORDER BY
      ABS(
        DATEDIFF(
          day,
          DATEADD(year, DATEDIFF(year, LiveDate, GETDATE()), LiveDate),
          GETDATE()
        )
      )
    

    ?


    更新 2

    根据提供的示例,这应该可以完成工作:

    …
    ORDER BY
      (MONTH(LiveDate) - MONTH(GETDATE()) + 12) % 12,
      DATEADD(year, YEAR(GETDATE()) - YEAR(LiveDate), LiveDate),
      YEAR(LiveDate)
    

    【讨论】:

    • 这只是最接近今天的日期。逐月更改也无济于事。考虑到年份,它仍在排序。不过,我可以看到你想做什么。
    • @inKit:我想我现在明白了。请看看我的更新。
    • 不,抱歉,这是在最接近的日期之前订购的。但它着眼于过去和未来。所以如果昨天比未来两天更近。即使未来两天比昨天等待一年更近。
    • @inKit:对不起,但现在我完全糊涂了! :) 现在在我看来,我以前的解决方案应该适合你。但是由于您拒绝了这两个,我真的希望您展示几个准确传达您的想法的各种示例。尽管您的问题看起来很简单,但事实证明我很难理解。所以也许这些例子可以提供帮助。 (请将它们添加到您的问题中。也许其他人可以比我更快地提出正确的解决方案。)
    • @inKit:谢谢。我已经更新了我的答案。不过,我必须承认,该解决方案已经been accepted 一次。但是因为您的问题是之前提出的,所以我认为如果我将解决方案合并到这个答案中而不是仅仅发布链接就可以了。 (作者无异议。)
    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多