【问题标题】:What would be the best way to compare SQL DATE using months and year使用月份和年份比较 SQL DATE 的最佳方法是什么
【发布时间】:2013-09-13 19:38:51
【问题描述】:

大家好,

今天我面临一些关于日期比较的问题,我有一组带有 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))

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

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

【问题讨论】:

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


    【解决方案1】:

    最好只使用范围查询:

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

    【讨论】:

    • 我的问题先生是用户给出的月份和年份。我怎样才能使用范围?请查看我的问题中的**编辑,因为有时我还需要根据用户的给定月份减去 4 个月谢谢:)
    • 我将如何使用此代码进行比较? DATEADD(month,DATEDIFF(month,0,PHI.fld_LoanDate),0) = @month(this is varchar 'September')+@year(this is varchar '2013')?对不起先生,如果我沉迷于使用字符串,我只是在 t-sql 中编码的初学者
    猜你喜欢
    • 1970-01-01
    • 2010-10-23
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多