使用月份和年份比较SQL DATE的最佳方法是什么

时间:2013-09-10 07:35:24

标签: tsql sql-server-2005 date datetime comparison

每个人的好日子,

今天我遇到了一些关于日期比较的问题,我有一组数据与SQL日期时间与他们

Sample Data

如果我想从特定月份和特定年份检索所有ID

  

(例如,所有ID的日期为2013年9月)

我在where子句

中使用这种代码
(DATENAME(MONTH,PHI.fld_LoanDate)) =  (DATENAME(MONTH,@month))
    AND
(DATEPART(YEAR,PHI.fld_LoanDate)) = (DATEPART(YEAR,@year))

但截至目前我遇到一些错误可能是因为日期中的丑陋比较

所以我想问一些关于如何改进代码的帮助,或者你是否可以给我一个更好的方法来比较使用月份和年份的日期

谢谢:)

**编辑:   月份和年份由用户给出,还有一些我使用的查询

(DATENAME(MONTH,PHI.fld_LoanDate)) =  (DATENAME(MONTH,DATEADD (MONTH,-4,@month + '2000')))  
  AND
    (DATEPART(YEAR,PHI.fld_LoanDate)) = (DATEPART(YEAR,@YEAR1))

因为我需要在美国人提供的特定日期减去几个月。

任何更好的方式都会受到高度赞赏:)

1 个答案:

答案 0 :(得分:3)

最好只使用范围查询:

PHI.fld_LoanDate >= '20130901' and
PHI.fld_LoanDate < '20131001'

通过这种方式,如果fld_LoanDate上可能有索引,则上述查询可以使用该索引。


看过编辑 - 即使这些值是由用户提供的,也很容易计算上述比较的开始和结束日期:

DECLARE @StartDate datetime
DECLARE @EndDate datetime

SET @StartDate = DATEADD(year,@Year - 1900,DATEADD(month,@Month - 1,'19000101'))
SET @EndDate = DATEADD(month,1,@StartDate)

然后使用:

PHI.fld_LoanDate >= @StartDate and
PHI.fld_LoanDate < @EndDate

我不确定为什么你会痴迷于按名称比较日期值,但这不太可能是最好的做事方式。


如果上述情况仍不充分,最后一招。这个不允许你使用索引,但确实简化了一些过程 - 你可以这样做:

DATEADD(month,DATEDIFF(month,0,PHI.fld_LoanDate),0)

fld_LoanDate中的日期向下舍入到最接近的月份的第1个。