我有一个有趣的难题,我需要能够经常在子查询中处理,当然还有最便宜的方法。现在我已经解决了这个问题,但我仍然在问这个问题,因为我打赌有更好的方法?如果没有,那就太好了,也许这会帮助别人。
我有一张非常具体的季节表,冬天跳到第二年,这是我的问题。
在我意识到我犯了一个愚蠢的错误之前,我是如何处理它的:
SeasonId | Name | From | To
-------------------------------------------
1 | Winter | 1900-12-01 | 1900-02-28
etc.
如前所述,我必须在一个一致的基础上质疑这一点,并试图使它尽可能简单。在子查询和子句中到处使用:
WHERE datefromparts(1900, month(getdate()), day(getdate()))
between [From] AND [To]
你看到骨头头的错误了吗?冬季的起始日期是同一年,所以当然现在(冬季作为这个问题)所有这些查询都失败了。
为了解决这个问题,我添加了以下列:
-
Leap Tinyint(我将此值设置为1表示冬季,其余为0)
-
从Tinyint来的月
-
来自Tinyint
-
蒙蒂丁因特
-
天到天
-
计算自(计算列)
-
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
我把这个复杂化了吗?我需要把它设置好,然后忘记它,也许是闰年的一个小变化,或者是在那个时候发生的一些事情。