每个人的好日子,
今天我遇到了一些关于日期比较的问题,我有一组数据与SQL日期时间与他们
如果我想从特定月份和特定年份检索所有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))
因为我需要在美国人提供的特定日期减去几个月。
任何更好的方式都会受到高度赞赏:)
答案 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个。