Tsql 查询年末的周时,查询1-365天不工作的表

Tsql 查询年末的周时,查询1-365天不工作的表,tsql,reporting-services,Tsql,Reporting Services,我在SSRS中查询了一个报告,它从周一到周一提取了8天的数据,表中有一个一年中每一天的id。在过去的一周,它失败了 ID_Table Country ID_Day ID_Num US 1 1111 US 2 2222 US 3 3333 US 4 4444 … … … … … … US 362 1234 US 363 5678 US

我在SSRS中查询了一个报告,它从周一到周一提取了8天的数据,表中有一个一年中每一天的id。在过去的一周,它失败了

ID_Table

Country ID_Day ID_Num
  US    1      1111
  US    2      2222
  US    3      3333
  US    4      4444
   …    …      …
   …    …      …
  US    362    1234
  US    363    5678
  US    365    3456


  DECLARE @begindate DATETIME ,
  @datestart INT ,
  @dateend INT ,
  @firstthisyear DATETIME ,
  @diff INT ,
  @firstnextyear DATETIME ,
  @endofyear DATETIME; 

 SET @begindate = '12/28/15';
 SET @datestart = DATEPART(DY, @begindate);
 SET @endofyear = DATEADD(yy, DATEDIFF(yy, 0, @begindate) + 1, -1);
 SET @dateend = 0;
 SET @diff = ( DATEPART(DY, @endofyear) ) - @datestart + 1;

 SET @firstthisyear = DATEADD(yy, DATEDIFF(yy, 0, @begindate), 0);
 SET @firstnextyear = DATEADD(yy, DATEDIFF(yy, 0, @begindate) + 1, 0);

 IF @diff < 7
    BEGIN
    SET @dateend = @diff;
    END;         

 SELECT DATEADD(dd, ID_Day - 1, @firstthisyear) AS [Active Date] ,
    ID_Day AS [Screen Number] ,
    ID_Num [Password]
 FROM   [Server].DB.dbo.DAY_ID_CONFIG
 WHERE  ID_Day >= @datestart
    AND ID_Day <= @datestart + 7

 UNION ALL
 SELECT DATEADD(dd, ID_Day - 1, @firstnextyear) AS [Active Date] ,
    ID_Day AS [Screen Number] ,
    ID_Num [Password]
 FROM   [Server].DB.dbo.DAY_ID_CONFIG
 WHERE  ID_Day <= @dateend
ID\u表
国家ID\u日期ID\u编号
美国1111
美国2222
美国3333
美国4444
…    …      …
…    …      …
美国3621234
美国3635678
美国365 3456
声明@begindate日期时间,
@datestart INT,
@dateend INT,
@今年第一个日期时间,
@diff INT,
@firstnextyear日期时间,
@endofyear日期时间;
SET@begindate='12/28/15';
设置@datestart=DATEPART(DY,@begindate);
设置@endofyear=DATEADD(yy,DATEDIFF(yy,0,@begindate)+1,-1);
设置@dateend=0;
设置@diff=(DATEPART(DY,@endofyear))-@datestart+1;
设置@firstthiseyear=DATEADD(yy,DATEDIFF(yy,0,@begindate),0);
设置@firstnextyear=DATEADD(yy,DATEDIFF(yy,0,@begindate)+1,0);
如果@diff<7
开始
设置@dateend=@diff;
结束;
选择DATEADD(dd,ID_Day-1,@firstthisyear)作为[活动日期],
ID_日期为[屏幕编号],
ID_Num[密码]
来自[Server].DB.dbo.DAY\u ID\u CONFIG
其中ID_Day>=@datestart
我会这样做(你可能需要改变一些,但这是我的想法):

如果DatePart(DAYOFYEAR,GETDATE())>=359
开始
选择DATEADD(dd,ID_Day-1,@firstthisyear)作为[活动日期],
ID_日期为[屏幕编号],
ID_Num[密码]
来自[Server].DB.dbo.DAY\u ID\u CONFIG
其中ID_Day>=DatePart(DAYOFYEAR,GETDATE())或
ID_Day=DatePart(DAYOFYEAR,GETDATE())和

ID_Day我想你的意思是“这对12/28/15-01/04/16很有效”你最好用ISO-8601格式的日期初始化日期。@roryap正确,谢谢。我想我需要做一些事情,比如如果第一个选择中有8行,那么如果少于8行,就不要并集。那么,01/04/16是否由359表示?或者是重新开始,然后将年份单独存储?
IF DatePart(DAYOFYEAR, GETDATE()) >= 359
BEGIN
    SELECT DATEADD(dd, ID_Day - 1, @firstthisyear) AS [Active Date] ,
    ID_Day AS [Screen Number] ,
    ID_Num [Password]
    FROM   [Server].DB.dbo.DAY_ID_CONFIG
    WHERE ID_Day >= DatePart(DAYOFYEAR, GETDATE()) OR 
    ID_Day <= DatePart(DAYOFYEAR, DateAdd(DAY, 7, GETDATE()))
END
ELSE
BEGIN
    SELECT DATEADD(dd, ID_Day - 1, @firstthisyear) AS [Active Date] ,
    ID_Day AS [Screen Number] ,
    ID_Num [Password]
    FROM   [Server].DB.dbo.DAY_ID_CONFIG
    WHERE ID_Day >= DatePart(DAYOFYEAR, GETDATE()) AND 
    ID_Day <= DatePart(DAYOFYEAR, DateAdd(DAY, 7, GETDATE()))
END