如果您只有開始和結束日期,以下是基本方法。我不太瞭解「登錄」位置如何適應,因此您需要更清楚地解釋您想要的輸出,或者將查詢擺到滿意的位置。此外,查詢是在SQL服務器,因爲我沒有安裝MySQL - 對不起!
CREATE TABLE LogTable
(
id int IDENTITY,
userId nvarchar(20),
logDate datetime,
position nvarchar(5)
)
GO
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-01', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-02', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-05', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-08', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-01', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-03', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-06', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-07', 'end')
GO
SELECT log1.userId, log1.logDate AS [start], log2.logDate AS [end],
DATEDIFF(d, log1.logDate, log2.logDate) AS [Diff. in Days]
FROM LogTable log1 JOIN
LogTable log2 ON log1.userId = log2.userId
WHERE log1.position = 'start'
AND log2.position = 'end'
AND log2.logDate > log1.logDate
AND NOT EXISTS (
SELECT *
FROM LogTable logDateCheck
WHERE logDateCheck.userId = log1.userId
AND logDateCheck.logDate >= log1.logDate
AND logDateCheck.logDate <= log2.logDate
AND logDateCheck.id NOT IN (log1.id, log2.id))
GO
輸出是:
你能告訴我們一個包含5個條目的示例表,以及你正在尋找的結果看起來像給出這5個條目嗎? – Matt 2011-03-17 09:40:14
爲什麼不在同一行更新三個日期?如果你確實知道每個用戶都有開始時間,登錄時間和結束時間,也許你最好用像tbl(key,uid,start,login,end)這樣的表? – Jai 2011-03-17 09:58:48