在SQL Server中查找由当前年份日期给定的上一年的同一天

在SQL Server中查找由当前年份日期给定的上一年的同一天,sql,sql-server,date,Sql,Sql Server,Date,我使用的是SQL Server,场景是找出上一年的同一天的日期和今天的日期 假设2014-03-06是今天,日期是星期四,我想找出上一个谎言中的同一天在同一周,也就是2013-03-07 有人能帮忙吗? 以下是我写的: DECLARE @DateFrom AS DATETIME DECLARE @DateTo AS DATETIME SET @DateFrom = '2014-01-01' SET @DateTo = '2014-02-10' DECLARE @Count AS I

我使用的是SQL Server,场景是找出上一年的同一天的日期和今天的日期

假设2014-03-06是今天,日期是星期四,我想找出上一个谎言中的同一天在同一周,也就是2013-03-07

有人能帮忙吗? 以下是我写的:

 DECLARE @DateFrom AS DATETIME
 DECLARE @DateTo AS DATETIME 


SET @DateFrom = '2014-01-01'
SET @DateTo = '2014-02-10'


DECLARE @Count AS INT

SET @Count = DATEDIFF(DAY, @DateFrom, @DateTo)


CREATE TABLE #current_year /*This Year*/
(
  [Date] DATETIME ,
  WeekNum INT,
  [Day] VARCHAR(20),
  Data INT
)
CREATE TABLE #last_year /*This Year -1*/
(
  [Date] DATETIME ,
  WeekNum INT,
  [Day] VARCHAR(20),
  Data INT
)
WHILE ( @Count > 0 ) 
        BEGIN
            INSERT  INTO #current_year
            VALUES  ( CONVERT(VARCHAR(10), @DateFrom, 101),                        
                      DATEPART(week,@DateFrom),
                      DATENAME(weekday, @DateFrom),@Count)          
            INSERT  INTO #last_year
            VALUES  ( CONVERT(VARCHAR(10), DATEADD(YEAR, -1, @DateFrom), 101),                                                  
                      DATEPART(week,DATEADD(YEAR,1,@DateFrom)),
                      DATENAME(weekday, DATEADD(YEAR, -1, @DateFrom)),@Count)  
            SET @DateFrom = DATEADD(day, 1, @DateFrom)
            SET @Count = @Count - 1
        END      
        SELECT * from #current_year     
        SELECT * from #last_year   

        SELECT CONVERT(varchar(10),#current_year.[Date],111) AS CYDate,
               --ISNULL(CONVERT(varchar(10),#last_year.[Date],111) ,/*CONVERT(varchar(10),DateAdd(dd, 1, DATEADD(yy, -1, #current_year.Date)),111)*/) AS LYDate
               --CONVERT(varchar(10),#last_year.[Date],111) AS LYDate
               Coalesce(CONVERT(varchar(10),#last_year.[Date],111) ,DateAdd(dd, 1, DATEADD(yy, -1, #current_year.Date))) AS LYDate,
               #current_year.Data AS CD,
               #last_year.Data AS LD
               FROM #current_year                            
               --LEFT JOIN #last_year ON #last_year.WeekNum = #current_year.WeekNum
   --                                 AND #last_year.[Day] = #current_year.[Day]
                                    Left JOIN #last_year ON #last_year.WeekNum =  DatePart(wk, GETDATE())



DROP TABLE #current_year
DROP TABLE #last_year
以下是输出:

这是添加解决方案后的输出,现在在左连接中,它排除上一年的空数据

DECLARE @now Date
SET @now = '2014-06-03'
SELECT DATEADD(week, -52, @now)
星期三

星期四

编辑:

给出“2013-03-07 17:30:16.590”

你需要根据你的要求确定日期

更新: 将此部分更改为

Left JOIN #last_year ON #last_year.WeekNum =  DatePart(wk, GETDATE())
就你而言:

更新2:

输出:

输出:


选择您所需的输出。

基本上,您需要找出今年和往年相同日期之间的天数差异,然后通过mod 7了解天数差异,并将其与上一年的日期相加:

DECLARE @now DATETIME
SET @now = '2014-03-06'


SELECT CAST (DATEADD(YEAR, -1, @now) + (CAST (@now as INT) - CAST (DATEADD(YEAR, -1, @now) AS INT)) % 7 AS DATE)
返回

2013-03-07
重新运行值:

2013-03-07


我想从这个查询中得到日期值:选择DateNamedw,DateAdddd,1,DATEADDyy,-1,GETDATEBuddy它很好地为我提供了正确的日期,但问题是,我显示的是同一天的两个年份的数据,不管日期如何,我与源表保持连接,并应用了相同的周和工作日的条件,但是它给了我上一周的记录,我无法与之匹配。我可以发布我的完整问题陈述吗?随着查询的进行和屏幕截图?伙计,我按照你说的做了,但问题是我已经重新发布了我的问题,通过在下面添加联接,它从联接表中获取0个零,请执行查询并查看结果。我们是否知道某个特定的星期四是我们想要的?也就是说,如果今天是2014-03-07,周五,我们想获得2013-03-01还是2013-03-08?根据您的定义,可能有很多边缘情况,以月的开始和结束为基础,闰年可能是一个因素。定义是什么使前一年的某一周成为同一周。但是。。。归结起来,哪一个更简单更清晰。
Left JOIN #last_year ON #last_year.WeekNum =  DatePart(wk, GETDATE())
Left JOIN #last_year ON DatePart(wk,  #last_year.[Date]) =  DatePart(wk, #current_year.[Date])
Left JOIN #last_year ON (MONTH(#last_year.[Date])=MONTH(#current_year.[Date]) and Day(#last_year.[Date])=Day(#current_year.[Date])) 
Left JOIN #last_year ON (#last_year.WeekNum = #current_year.WeekNum and #last_year.[Day] = #current_year.[Day])
DECLARE @now DATETIME
SET @now = '2014-03-06'


SELECT CAST (DATEADD(YEAR, -1, @now) + (CAST (@now as INT) - CAST (DATEADD(YEAR, -1, @now) AS INT)) % 7 AS DATE)
2013-03-07
DECLARE @Date DATE = '2014-03-06'
SELECT DATEADD(WEEK,-52,@Date)