是第一个月的第1个月和第7个月的第29个月之间的日期(Sql Server 2008 +)

时间:2016-05-11 06:32:44

标签: sql-server

我需要检查日期是否在任何一年的第1个月和第7个月的第29个月之间。 在继续并且从日期开始提取月份日并将其与0101和0729之间进行比较(或者只是检查日期dd mm是否小于629)类型的丑陋解决方案之前,我必须要问是否有一个功能来检查任何日期属于部分日期和月份之间,与年份不变。

其他明智的提取日期和日期并做一些hacky arithmatic很容易,但我想留下一个更好的代码给那些将跟随我的穷人程序员而不必猜测为什么一些怪异的组成算术正在进行中,即使需要更长时间,我也要明确。

3 个答案:

答案 0 :(得分:1)

Select * from TableWithNoName where DateField1 between DATETIMEFROMPARTS( YEAR(DateField1),1, 1, 0, 0, 0, 0 )  and DATETIMEFROMPARTS( YEAR(DateField1),7, 29, 23, 59, 59, 999 )

假设DateField1是日期值

答案 1 :(得分:1)

where datetimeField < dateFromParts( year( dateTimeField ), 7, 30)

编辑:以上将在2012年及以后工作。对于2008年,你可以为开发人员做一些“非常简单”的算法:

where datetimeField < CAST(CAST(year(dateTimeField) AS CHAR(4))+'0730' AS DATE);

或简化一下:

where datetimeField < CAST(year(dateTimeField) AS CHAR(4))+'0730';

PS:在日期时间字段中使用BETWEEN(其行为类似x&gt; = v1和x&lt; = v2)的常见缺陷,其中字段可能具有时间部分,不建议并且永远不会有助于精确获取正确的记录(因为没有办法指定结束时间)。相反,你应该总是使用x&gt; = v1和x&lt; v2样式,其中v2是最小独占上限值。即:要在2000年5月获得所有销售(saleDate有时间部分):

saleDate >= '20000501' and saleDate < '20000601'

NOT:

saleDate between  '20000501' and '20000531'

或不:

saleDate >= '20000501' and saleDate <= '20000531' 

答案 2 :(得分:1)

另一种选择:

DECLARE @TheDate date = '2016-07-29';

SELECT 1 
WHERE DATEADD(Year, -(YEAR(@TheDate) - 2000), @TheDate) 
    BETWEEN '2000-01-01' AND '2000-07-29'
相关问题