【问题标题】:SQL Server - Select years only if they fall in the current year or previous yearSQL Server - 仅当它们属于当前年份或上一年时才选择年份
【发布时间】:2011-01-12 16:36:02
【问题描述】:

我只想获取当前年份和前一年的日期。因此,如果是 2011 年,我会得到 2011 年和 2010 年的日期。如果是 2012 年,我会得到 2012 年和 2011 年的日期。

SELECT 
   DISTINCT DATEPART(yyyy, date ) as arc_year 
FROM 
   dbo.sports 
WHERE 
   team_id = '".$id."' 
ORDER BY 
   DATEPART(yyyy, date ) DESC

提前感谢您的帮助

【问题讨论】:

    标签: sql-server date


    【解决方案1】:

    您希望避免在列本身上使用函数,以便可以使用索引。

    ... WHERE date >= DATEADD(year,DATEDIFF(year,0,getdate()) - 1,0) 
          and date <  DATEADD(year,DATEDIFF(year,0,getdate()) + 1,0) ...
    

    【讨论】:

    【解决方案2】:

    几件事。首先,你永远不应该那样写查询。使用参数化查询。你的上面写满了“sql injection”。

    其次,最好的方法是:

    declare @teamid int = -- some value
    
    select * from sports 
      where (team_id = @teamid)
      and date > DATEADD(year,DATEDIFF(year,0,getdate()) - 1,0) 
    

    如果日期列可以包含大于当前年份的值,则查询将是:

    declare @startdate datetime = DATEADD(year,DATEDIFF(year,0,getdate()) - 1,0) 
    declare @enddate datetime = DATEADD(year,+1,@startdate)
    declare @teamid int = -- some value
    
    select * from sports 
    where (team_id = @teamid)
    and date BETWEEN @startdate and @EndDate
    

    【讨论】:

    • 我假设您的意思是“您也不想为每个 row 运行该函数”。我实际上不确定这是否会发生。如果它在select 列表中,则不会。无论查询运行多长时间,select getdate() 都会返回相同的值。
    • 这表明谓词不会被重复计算。 create table #t (i int); INSERT INTO #t select CHECKSUM(NEWID())%2 from sys.all_columns select i, COUNT(*) from #t group by i; select COUNT(*) from #t WHERE i=CHECKSUM(rand())%2 drop table #t
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多