我遇到了一个有趣的难题,我需要能够经常在子查询中处理,当然,这也是最便宜的方法。现在我已经解决了这个问题,但我仍然在问这个问题,因为我打赌还有更好的方法?
我有一个季节表非常具体,冬天跳到下一年,这是我的问题。
在我意识到自己犯了一个愚蠢的错误之前,我最初是如何处理这个问题的:
SeasonId | Name | From | To
-------------------------------------------
1 | Winter | 1900-12-01 | 1900-02-28
etc.如前所述,我必须在一致的基础上对此进行查询,并试图保持尽可能简单。在子查询和子句中到处使用这一点:
WHERE datefromparts(1900, month(getdate()), day(getdate()))
between [From] AND [To]你看到骨头的错误了吗?冬天的日期是同一年,所以当然现在(这个问题的冬天)所有这些查询都失败了。
因此,为了解决这个问题,我添加了以下列:
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我把事情弄得太复杂了吗?我需要设置它,忘记它,也许是闰年的一个小变化,或者在那个时候发生什么。
发布于 2018-12-07 15:57:03
您可以进行以下比较:
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]
) 发布于 2018-12-07 16:02:02
如果我正确地理解了这一点,那么看一下这个月就足够了:
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;https://stackoverflow.com/questions/53672852
复制相似问题