您的SQL小提琴設置爲使用MYSQL,而不是SQL Server 2008,所以我無法測試我對數據的答案:但是,根據我對您的要求的理解並假設您正在查詢SQL 2008數據庫,下面的例子應該爲你工作(對我的表變量的引用顯然將被你的實際表格所取代)。
DECLARE @StartDate DATE = '06/04/2014'
DECLARE @EndDate DATE = GETDATE();
DECLARE @LogTimePeriod TABLE (LogTimePeriodID INT IDENTITY(1,1), TimePeriod VARCHAR(20))
INSERT INTO @LogTImePeriod (TimePeriod) SELECT '00:00 - 07:59'
INSERT INTO @LogTImePeriod (TimePeriod) SELECT '08:00 - 15:59'
INSERT INTO @LogTImePeriod (TimePeriod) SELECT '16:00 - 23:59'
DECLARE @logs TABLE (LogDataID INT IDENTITY(1,1), LogDate DATE, SomeInformation VARCHAR(10), LogTimePeriodID INT)
INSERT INTO @logs (SomeInformation, LogDate, LogTimePeriodID) SELECT 'abc', '6/4/2014', 1
INSERT INTO @logs (SomeInformation, LogDate, LogTimePeriodID) SELECT 'def', '6/4/2014', 2
INSERT INTO @logs (SomeInformation, LogDate, LogTimePeriodID) SELECT 'ghi', '6/4/2014', 3
INSERT INTO @logs (SomeInformation, LogDate, LogTimePeriodID) SELECT 'abc', '6/5/2014', 1
INSERT INTO @logs (SomeInformation, LogDate, LogTimePeriodID) SELECT 'def', '6/5/2014', 2;
WITH dates AS (
SELECT CAST(@StartDate AS DATETIME) 'date'
UNION ALL
SELECT DATEADD(dd, 1, t.date)
FROM dates t
WHERE DATEADD(dd, 1, t.date) <= @EndDate)
SELECT ltp.LogTimePeriodID, ltp.TimePeriod, dates.date
FROM
@LogTimePeriod ltp
INNER JOIN
dates ON 1=1
LEFT JOIN
@logs ld ON
ltp.LogTimePeriodID = ld.LogTimePeriodID AND
dates.date = ld.LogDate
WHERE ld.LogDataID IS NULL
OPTION (MAXRECURSION 1000) -- 0 is unlimited, 1000 limits to 1000 rows
那麼這將是該查詢的預期效果? – cy3er
未完成日誌的日期和LogTimePeriodID列表。在我的小提琴6月3日,只有3個時間段中有2個完成,6月5日只有3箇中的1個(同一時間段完成兩次)。請參閱我的原始問題的編輯例如輸出。 – koolaide