2016-08-04 115 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