2016-10-04 56 views
0

我與時間戳記錄工作,需要做一個內部聯接基於時間戳差異。我一直在使用DATEDIFF函數,它似乎運行良好。但是,時間戳之間的時間量會有所不同。爲了澄清,有時記錄出現在表2中的相同的第二內如表1,有時在表2中記錄要由記錄後面15秒錶1表1中的記錄表2.前總是時間戳並不是我可以加入的其他常見字段,但是每個表中都有一個寄存器編號,用於通過確保寄存器相同來提高準確性。SQL Server內部加入時間戳:每個記錄只分配一次?

我的問題是:如果我增加時間戳差異做內部聯接(例如,DATEDIFF = 1或2或3 ...或15)將只記錄一次嗎?或者我的表格是否包含來自表1的重複記錄(例如,記錄1與表2中的記錄4連接,其中差異是4秒,並且還與來自表2的記錄7連接,差異是11秒)?

的原因,我的發言現在的工作是沒有寄存器有不到6秒記錄之間,所以即使有多個時間點,將匹配,寄存器的匹配消除了這個問題。

我聲明目前正在爲:

SELECT * 
INTO AtriumSequoiaJoin5 
FROM Atrium INNER JOIN Sequoia ON Atrium.Reader = Sequoia.theader_pos_name 
WHERE (
    ((DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=0 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=1 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=2 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=3 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=4 
    Or (Datediff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=5) 
    ) 
ORDER BY Sequoia.theader_id; 
+0

注意:您可以只使用'則DateDiff(S,[中庭] [日期2],[紅杉] [theader_tdatetime] )在0和5之間而不是這個長的WHERE語句。即使你使用秒的間隔(0到5),它已經可以從「Sequoia」表中加入多於1行。 – gofr1

+1

我猜測,通過時間戳你是指日期時間值?由於時間戳是sql服務器中的一種數據類型,與一天中的時間無關,所以要小心。 –

+0

爲什麼在這裏使用所有這些OR謂詞?爲什麼不簡單地使用範圍而不是一遍又一遍地檢查相同的值?您的整個where子句可以輕鬆簡化爲單個謂詞。無論如何,像這樣加入這個網站很容易出錯。你真的應該有更好的連接行的方法,然後假設日期很近。這是外鍵被設計用於的。 –

回答

2

可以交叉適用於接近最接近的紀錄。然而,這並不理想,如果同時寫入多個記錄會怎樣?你或許應該給第一個表中的標識字段,然後用scopeidentity更新下表

SELECT * 

INTO AtriumSequoiaJoin5 

FROM Atrium CROSS APPLY 
    (SELECT TOP 1 * FROM Sequoia WHERE 
      Atrium.Reader = Sequoia.theader_pos_name 
      ORDER BY Datediff(millisecond,[Atrium].[Date2],[Sequoia].[theader_tdatetime])) DQ 

ORDER BY Sequoia.theader_id; 
+0

我認爲這應該工作,因爲這是在同一時間寫的只記錄發生在不同的寄存器和匹配Atrium.Reader = Sequoia.theader_pos_name被淘汰。 –

相關問題