If promiseddate has a time component also, the behavior you are seeing can happen. You can test that hypothesis easily by changing your query as shown in redDECLARE @today DATETIME,
@nextDate DATETIME,
@secondDate DATETIME,
@thirdDate DATETIME;
SET @today = CAST(CONVERT(VARCHAR(10), GETDATE(), 101) AS DATETIME);
SET @nextDate = (
SELECT MIN(
CAST(CONVERT(VARCHAR(10), b.promiseddate, 101) AS DATETIME)
) AS promiseddate
FROM podetail a
INNER JOIN po b
ON a.guidpo = b.guidpo
WHERE b.promiseddate >= DATEADD(dd,1,@today)
);
SELECT @nextDate;
SET @secondDate = (
SELECT MIN(
CAST(CONVERT(VARCHAR(10), b.promiseddate, 101) AS DATETIME)
) AS promiseddate
FROM podetail a
INNER JOIN po b
ON a.guidpo = b.guidpo
WHERE b.promiseddate >=DATEADD(dd,DATEDIFF(dd,0,@nextDate),1)
);
SELECT @secondDate;