2016-08-04 113 views
0

我在SQL Server 2014中有一張帶時間戳的表。從SQL Server表中比較日期時間和用戶的日期時間,並從表格中獲取最接近用戶日期時間的日期

這是我的表:

enter image description here

我想每個時間戳從我的表與一個時間戳,我輸入比較,並從我的表中獲取的時間戳爲其datediff(table_timeStamp, @myTimestamp)最小。希望清楚我想要什麼。這是一個功能,我想知道如何以最簡單的方式做到這一點?

+0

要明確,你的time_stamp實際上是一個日期字段,而不是類型的時間戳? –

+0

在我的表中,'Time_Stamp'列的類型是datetime –

+0

SELECT TOP 1 * ...........按ABS排序(datediff(s,table_timeStamp,@myTimestamp)) – Cato

回答

2
SELECT TOP 1 * ........... order by ABS(datediff(second,table_timeStamp, @myTimestamp)) 
0

如果表的Time_Stamp列有索引,則該查詢的工作速度會快得多。 winner查詢將始終執行表掃描和NEWER使用索引。

SELECT TOP 1 Time_Stamp FROM 
    SELECT Max(Time_Stamp) as Time_Stamp FROM MyTable WHERE Time_Stamp < @myTimestamp 
UNION 
    SELECT MIN(Time_Stamp) as Time_Stamp FROM MyTable WHERE Time_Stamp > @myTimestamp) 
ORDER BY 1 
+0

雖然這段代碼可能有助於解決問題,提供 附加上下文關於_why_和/或_how_它回答 該問題將顯着提高其長期值 值。請[編輯]你的答案,添加一些解釋。 –

+0

這很簡單。如果在Time_Stamp上有索引,我的代碼更快。 –

+0

請[編輯]您的答案,添加解釋。其他答案根本沒有解決速度問題,所以這是一種區分你的方式。 :-) –

0

如果你想在最接近的日期之前的日期輸入:

;With cteTestDates As 
(
Select *, DateDiff(Second,datefield1, '2016-07-01') DateDifference 
    From TestDates 
) 
Select Top 1 * 
    From cteTestDates 
    Where DateDifference >= 0 
    Order By DateDifference 

如果你想在最接近的日期不論它是在過去或未來:

;With cteTestDates As 
(
Select *, ABS(DateDiff(Second,datefield1, '2016-07-03')) DateDifference 
    From TestDates 
) 
Select Top 1 * 
    From cteTestDates 
    Order By DateDifference