我已經介紹了一些別名,使查詢更容易閱讀,並添加了所需的條件。我也改變了WHERE
條款,不知道這是必需的:
SELECT m.[MissionId]
FROM [dbo].[Mission] m LEFT OUTER JOIN [dbo].[Report] r
ON m.[MissionId] = r.[MissionId]
AND r.ReportDate = DATEADD(day,DATEDIFF(day,0,GETDATE()),0)
WHERE r.MissionId IS NULL
ORDER BY m.[MissionId]
這假定ReportDate
包含設置爲午夜時間部分日期。如果不是這樣,那麼一個稍微複雜的查詢要求:
SELECT m.[MissionId]
FROM [dbo].[Mission] m
WHERE NOT EXISTS(select * from dbo.Report r
where r.MissionID = m.MissionID and
r.ReportDate >= DATEADD(day,DATEDIFF(day,0,GETDATE()),0) and
r.ReportDate < DATEADD(day,DATEDIFF(day,0,GETDATE()),1)
)
ORDER BY m.[MissionId]
GETDATE()
返回當前的日期和時間。我使用了DATEADD
和DATEDIFF
中的一些技巧來獲取該值,並在午夜將其轉換爲當前日期,並且(在第二個查詢中)明天的午夜時間。
第二查詢作爲完全可運行查詢:
declare @mission table (MissionID int not null);
insert into @mission (MissionID) select 1 union all select 2;
declare @report table (MissionID int not null,ReportDate datetime not null);
insert into @report (MissionID,ReportDate)
select 2,GETDATE() union all select 1,DATEADD(day,-1,GETDATE());
SELECT m.[MissionId]
FROM @mission m
WHERE NOT EXISTS(select * from @report r
where r.MissionID = m.MissionID and
r.ReportDate >= DATEADD(day,DATEDIFF(day,0,GETDATE()),0) and
r.ReportDate < DATEADD(day,DATEDIFF(day,0,GETDATE()),1)
)
ORDER BY m.[MissionId]
結果:
MissionId
-----------
1
+1從我來說,這看起來不錯。 –
進一步測試,選項2沒有任何行。任何想法爲什麼? – StackTrace
@ SQL.NETWarrior - 如果您可以用一些示例數據設置[sqlfiddle](http://sqlfiddle.com/),或者將一些示例數據添加到您的問題和預期結果中,您將得到完全測試的查詢。事實上,我只能編制它的工作數據。我在答案的底部添加了完整的repro腳本。 –