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

需要一种方法来确定getDate()是否在使用SQL的特定季节之间

  •  -1
  • user1447679  · 技术社区  · 6 年前

    我有一个有趣的难题,我需要能够经常在子查询中处理,当然还有最便宜的方法。现在我已经解决了这个问题,但我仍然在问这个问题,因为我打赌有更好的方法?如果没有,那就太好了,也许这会帮助别人。

    我有一张非常具体的季节表,冬天跳到第二年,这是我的问题。

    在我意识到我犯了一个愚蠢的错误之前,我是如何处理它的:

    SeasonId | Name   | From       | To
    -------------------------------------------
    1        | Winter | 1900-12-01 | 1900-02-28
    etc.
    

    如前所述,我必须在一个一致的基础上质疑这一点,并试图使它尽可能简单。在子查询和子句中到处使用:

    WHERE datefromparts(1900, month(getdate()), day(getdate())) 
    between [From] AND [To]
    

    你看到骨头头的错误了吗?冬季的起始日期是同一年,所以当然现在(冬季作为这个问题)所有这些查询都失败了。

    为了解决这个问题,我添加了以下列:

    1. Leap Tinyint(我将此值设置为1表示冬季,其余为0)
    2. 从Tinyint来的月
    3. 来自Tinyint
    4. 蒙蒂丁因特
    5. 天到天
    6. 计算自(计算列)
    7. computedto(计算列)

    这个 ComputedFrom 公式如下:

    (datefromparts(datepart(year,getdate()),[MonthFrom],[DayFrom]))
    

    这个 ComputedTo 公式如下:

    (datefromparts(datepart(year,dateadd(year,[Leap],getdate())),[MonthTo],[DayTo]))
    

    这个查询的概念以及它为什么/它如何需要可以在逻辑上被这个例子总结:

    SELECT CoatType FROM dbo.Coats 
    WHERE getdate() BETWEEN ComputedFrom AND ComputedTo
    

    我把这个复杂化了吗?我需要把它设置好,然后忘记它,也许是闰年的一个小变化,或者是在那个时候发生的一些事情。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    你可以做如下比较:

    where ([From] <= [To] and datefromparts(1900, month(getdate()), day(getdate())) 
    between [From] and [To]
          ) or
          ([From] >= [To] and datefromparts(1900, month(getdate()), day(getdate())) 
    not between [From] and [To]
          ) 
    
        2
  •  0
  •   Gottfried Lesigang    6 年前

    如果我没弄错的话,看看这个月就足够了:

    DECLARE @dt DATE = GETDATE();
    
    SELECT CASE MONTH(@dt) WHEN 1 THEN 'Winter'
                           WHEN 2 THEN 'Winter'
                           WHEN 3 THEN 'Spring'                      
                           WHEN 4 THEN 'Spring'                       
                           WHEN 5 THEN 'Spring'
                           WHEN 6 THEN 'Summer'
                           WHEN 7 THEN 'Summer'
                           WHEN 8 THEN 'Summer'
                           WHEN 9 THEN 'Autumn'
                           WHEN 10 THEN 'Autumn'
                           WHEN 11 THEN 'Autumn'
                           WHEN 12 THEN 'Winter' END;