Tsql 查询年末的周时,查询1-365天不工作的表
我在SSRS中查询了一个报告,它从周一到周一提取了8天的数据,表中有一个一年中每一天的id。在过去的一周,它失败了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
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