T-sql 帮助切换SSRS报告上的日期
T-sql help to switch dates on the SSRS report
根据以下业务规则,我需要更改报告中的计划交付日期。以下是 DDL:
1) 如果作业有批号,则计划发货日期将是要求交货日期的下周一。例如,如果作业的要求交货日期为 2015-07-29,并且它还有一个批号,则计划发货日期将为 2015-08-03。
2) 如果工作没有批号,则计划发货日期将是要求交货日期之前的星期一。例如,如果工作 J012347 的要求交货日期为 2015-08-04 并且没有批号,则计划发货日期将为之前的星期一,即 2015-08-04。
同样,如果要求交货日期为 2015-08-07 并且没有批号,则计划交货日期将为 2015-08-03。
我们能做到吗?我很感激这方面的任何帮助。
希望对您有所帮助
这是 DDL:
DECLARE @Date datetime;
SET @Date = GETDATE();
DECLARE @TEST_DATA TABLE
(
DT_ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED
,JobNumber VARCHAR(10) NOT NULL
,JobStatus CHAR(1) NOT NULL
,ExpectedDate VARCHAR(10) NOT NULL
,LastShippedDate VARCHAR(10) NULL
,BatchNumber VARCHAR(10) NULL
);
INSERT INTO @TEST_DATA (JobStatus, JobNumber,ExpectedDate,LastShippedDate, BatchNumber)
VALUES
('S', 'J012345','2015-07-10','2015-07-10', 'B001')
,('S', 'J012346','2015-07-15','2015-07-17', 'B001')
,('S', 'J012346','2015-07-17','2015-07-15', 'B002')
,('S', 'J012346','2015-07-08','2015-07-10', 'B002')
,('O', 'J012347','2015-08-04',NULL, NULL)
,('O', 'J012347','2015-07-24',NULL, 'B003')
,('O', 'J012347','2015-07-31',NULL, 'B003')
,('O', 'J012347','2015-07-27',NULL, 'B004')
,('O', 'J012348','2015-07-21',NULL, 'B004')
,('O', 'J012349','2015-07-31',NULL, NULL)
,('O', 'J012350','2015-08-07',NULL, NULL)
,('O', 'J012351','2015-08-14',NULL, NULL)
,('O', 'J012362','2015-08-28',NULL, 'B004')
,('O', 'J012363','2015-07-22',NULL, 'B005')
,('O', 'J012364','2015-07-24',NULL, NULL)
,('O', 'J012365','2015-07-31',NULL, NULL)
,('O', 'J012366','2015-08-21',NULL, 'B006')
,('O', 'J012372','2015-07-27',NULL, 'B007')
,('O', 'J012378','2015-07-29',NULL, 'B008')
,('O', 'J012367','2015-08-11',NULL, NULL)
,('O', 'J012367','2015-07-30',NULL, NULL)
,('O', 'J012367','2015-09-18',NULL, 'B006')
;
SELECT
J.DT_ID
,JobNumber
,J.JobStatus /*O-Open, S-Shipped, I-Invoiced*/
,J.ExpectedDate 'Requested Delivery Date'
,J.LastShippedDate
, BatchNumber
,CASE
/* SHIPPED - SHOW LastShippedDate */
WHEN j.JobStatus ='S' OR j.JobStatus ='I' OR j.JobStatus ='V' THEN Cast(j.LastShippedDate as DATE)
/* MISSED SHIPMENT SET TO NEXT MONDAY */
WHEN j.JobStatus <>'S' AND DATEDIFF(dd,0,ExpectedDate)/7 <= DATEDIFF(dd,0,@Date) / 7 THEN
DATEADD(DAY,((DATEDIFF(dd,0,@Date)/7) * 7) + 7,0)
/* FUTURE SHIPMENTS */
--ELSE CAST(J.ExpectedDate AS DATE)
ELSE DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7) + 7,0)
END AS [Scheduled Ship Date],
DATENAME(dw, J.ExpectedDate) AS ExpectedDateDayName,
DATENAME(dw, CASE
WHEN j.JobStatus ='S' OR j.JobStatus ='I' OR j.JobStatus ='V' THEN Cast(j.LastShippedDate as DATE)
WHEN j.JobStatus <>'S' AND DATEDIFF(dd,0,ExpectedDate)/7 <= DATEDIFF(dd,0,@Date) / 7 THEN
DATEADD(DAY,((DATEDIFF(dd,0,@Date)/7) * 7) + 7,0)
--ELSE CAST(J.ExpectedDate AS DATE)
ELSE DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7) + 7,0)
END) AS ScheduledShipDateDayName
FROM @TEST_DATA AS J
ORDER BY [Requested Delivery Date]
如果没有批次并且在请求日期的前一个星期一有批次,那么您正在尝试查找 "next monday":
Select Case when BatchNumber is not null then
case when datepart(dw,J.ExpectedDate) > 1 then DATEADD(dd,9-DATEPART(dw,J.ExpectedDate),J.ExpectedDate)
else DATEADD(dd,1,J.ExpectedDate) end
Else dateadd(ww,-2, case when datepart(dw,J.ExpectedDate) > 1 then DATEADD(dd,9-DATEPART(dw,J.ExpectedDate),J.ExpectedDate)
else DATEADD(dd,1,J.ExpectedDate) end) end AS [Scheduled Ship Date]
FROM @TEST_DATA AS J
根据以下业务规则,我需要更改报告中的计划交付日期。以下是 DDL:
1) 如果作业有批号,则计划发货日期将是要求交货日期的下周一。例如,如果作业的要求交货日期为 2015-07-29,并且它还有一个批号,则计划发货日期将为 2015-08-03。
2) 如果工作没有批号,则计划发货日期将是要求交货日期之前的星期一。例如,如果工作 J012347 的要求交货日期为 2015-08-04 并且没有批号,则计划发货日期将为之前的星期一,即 2015-08-04。
同样,如果要求交货日期为 2015-08-07 并且没有批号,则计划交货日期将为 2015-08-03。
我们能做到吗?我很感激这方面的任何帮助。
希望对您有所帮助
这是 DDL:
DECLARE @Date datetime;
SET @Date = GETDATE();
DECLARE @TEST_DATA TABLE
(
DT_ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED
,JobNumber VARCHAR(10) NOT NULL
,JobStatus CHAR(1) NOT NULL
,ExpectedDate VARCHAR(10) NOT NULL
,LastShippedDate VARCHAR(10) NULL
,BatchNumber VARCHAR(10) NULL
);
INSERT INTO @TEST_DATA (JobStatus, JobNumber,ExpectedDate,LastShippedDate, BatchNumber)
VALUES
('S', 'J012345','2015-07-10','2015-07-10', 'B001')
,('S', 'J012346','2015-07-15','2015-07-17', 'B001')
,('S', 'J012346','2015-07-17','2015-07-15', 'B002')
,('S', 'J012346','2015-07-08','2015-07-10', 'B002')
,('O', 'J012347','2015-08-04',NULL, NULL)
,('O', 'J012347','2015-07-24',NULL, 'B003')
,('O', 'J012347','2015-07-31',NULL, 'B003')
,('O', 'J012347','2015-07-27',NULL, 'B004')
,('O', 'J012348','2015-07-21',NULL, 'B004')
,('O', 'J012349','2015-07-31',NULL, NULL)
,('O', 'J012350','2015-08-07',NULL, NULL)
,('O', 'J012351','2015-08-14',NULL, NULL)
,('O', 'J012362','2015-08-28',NULL, 'B004')
,('O', 'J012363','2015-07-22',NULL, 'B005')
,('O', 'J012364','2015-07-24',NULL, NULL)
,('O', 'J012365','2015-07-31',NULL, NULL)
,('O', 'J012366','2015-08-21',NULL, 'B006')
,('O', 'J012372','2015-07-27',NULL, 'B007')
,('O', 'J012378','2015-07-29',NULL, 'B008')
,('O', 'J012367','2015-08-11',NULL, NULL)
,('O', 'J012367','2015-07-30',NULL, NULL)
,('O', 'J012367','2015-09-18',NULL, 'B006')
;
SELECT
J.DT_ID
,JobNumber
,J.JobStatus /*O-Open, S-Shipped, I-Invoiced*/
,J.ExpectedDate 'Requested Delivery Date'
,J.LastShippedDate
, BatchNumber
,CASE
/* SHIPPED - SHOW LastShippedDate */
WHEN j.JobStatus ='S' OR j.JobStatus ='I' OR j.JobStatus ='V' THEN Cast(j.LastShippedDate as DATE)
/* MISSED SHIPMENT SET TO NEXT MONDAY */
WHEN j.JobStatus <>'S' AND DATEDIFF(dd,0,ExpectedDate)/7 <= DATEDIFF(dd,0,@Date) / 7 THEN
DATEADD(DAY,((DATEDIFF(dd,0,@Date)/7) * 7) + 7,0)
/* FUTURE SHIPMENTS */
--ELSE CAST(J.ExpectedDate AS DATE)
ELSE DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7) + 7,0)
END AS [Scheduled Ship Date],
DATENAME(dw, J.ExpectedDate) AS ExpectedDateDayName,
DATENAME(dw, CASE
WHEN j.JobStatus ='S' OR j.JobStatus ='I' OR j.JobStatus ='V' THEN Cast(j.LastShippedDate as DATE)
WHEN j.JobStatus <>'S' AND DATEDIFF(dd,0,ExpectedDate)/7 <= DATEDIFF(dd,0,@Date) / 7 THEN
DATEADD(DAY,((DATEDIFF(dd,0,@Date)/7) * 7) + 7,0)
--ELSE CAST(J.ExpectedDate AS DATE)
ELSE DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7) + 7,0)
END) AS ScheduledShipDateDayName
FROM @TEST_DATA AS J
ORDER BY [Requested Delivery Date]
如果没有批次并且在请求日期的前一个星期一有批次,那么您正在尝试查找 "next monday":
Select Case when BatchNumber is not null then
case when datepart(dw,J.ExpectedDate) > 1 then DATEADD(dd,9-DATEPART(dw,J.ExpectedDate),J.ExpectedDate)
else DATEADD(dd,1,J.ExpectedDate) end
Else dateadd(ww,-2, case when datepart(dw,J.ExpectedDate) > 1 then DATEADD(dd,9-DATEPART(dw,J.ExpectedDate),J.ExpectedDate)
else DATEADD(dd,1,J.ExpectedDate) end) end AS [Scheduled Ship Date]
FROM @TEST_DATA AS J