0

今天是个好日子,

今天我面临一些关于日期比较的问题,我有一组带有 SQL 日期时间的数据

样本数据

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

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

我在 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))

因为我需要在用户给出的特定日期减去几个月。

任何更好的方法将不胜感激:)

4

1 回答 1

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 日。

于 2013-09-10T07:38:19.460 回答