T-sql help to switch dates on the report

 I've a requirement per below business rule to change the Scheduled Delivery Date on the report. Below is the DDL:

1) If the Job has a batch number, the Scheduled Ship Date will be next monday to Requested Delivery Date. Say for example if the job has Requested Delivery Date as 2015-07-29 and it also has a batch number then Scheduled Ship Date will be 2015-08-03.

2) If the Job does not have a batch number then the Scheduled Ship Date will be the Monday before the REquested Delivery Date. Say for example if the Job J012347 has Requested Delivery date as 2015-08-04 and it does not have batch number then the Scheduled Ship Date will be the Monday before i.e. 2015-08-04. 

Similarly if the Requested Delivery date is 2015-08-07 and it does not have a batch number then Scheduled Delivery Date will be 2015-08-03.

Can we achieve this? I appreciate any help on this. 

Hope this helps

Here is the 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]

July 24th, 2015 10:25am

It looks like you're almost there. Just use another case statement for the condition:

CASE WHEN BatchNumber IS NULL ...

   ELSE ...

END


Free Windows Admin Tool Kit Click here and download it now
July 24th, 2015 10:46am

BrianDBA,

I tried using another case statement. Still stuck. Any help is appreciated.

Thanks

July 24th, 2015 10:53am

	CASE 
		/* Previous Monday */
		WHEN BatchNumber IS NULL THEN DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7),0)
		/* Next Monday */
		ELSE DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7) + 7,0)
	END AS [New Scheduled Ship Date],
Does this give you what you're looking for?
Free Windows Admin Tool Kit Click here and download it now
July 24th, 2015 11:02am

Hi,

Find your query below

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)
WHEN j.BatchNumber IS NULL THEN CAST(DATEADD(wk, DATEDIFF(wk, 0,j.ExpectedDate),0) AS DATE)
/* 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
July 24th, 2015 11:17am

Hi Milan,

This is what I exactly want. The only issue is when the Job has a batch number, say J012362 has Requested Delivery Date as 2015-08-28, the ScheduledShipDate should show 2015-08-24. In the DDL you suggested the Scheduled Ship Date shows 2015-08-31. Any help on this is greatly appreciated. Thanks

Free Windows Admin Tool Kit Click here and download it now
July 24th, 2015 3:00pm

Please find the modified query.

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)
WHEN j.BatchNumber IS NULL THEN CAST(DATEADD(wk, DATEDIFF(wk, 0,j.ExpectedDate),0) AS DATE)
WHEN j.BatchNumber IS  NOT NULL THEN CAST(DATEADD(wk, DATEDIFF(wk, 0,j.ExpectedDate),0) AS DATE)
/* 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

July 25th, 2015 1:08am

This topic is archived. No further replies will be accepted.

Other recent topics Other recent topics