2011-07-06 49 views
0

我有点困惑如何或什么最好的方式来确定最接近的日期是DateTime.Now是。如何确定最近的日期

在我的表中,一切都需要加时间戳。并且在一个页面上,只有当日期是最接近的日期时,我才能够从表中检索所有内容。

我该怎么办?

插入日期到数据库中,当我使用DateTime.Now,格式是这样的:

5/07/2011 5:28:57 PM 
+1

'最接近'表示四舍五入,即下午11点将是下一天。这不是习惯,通常我们会截断时间戳以找到日期。 –

+0

是的!我知道我已经忘记了我想要的更好的词 – bendr

回答

1

如何

SELECT TOP 1 * 
FROM MyTable 
ORDER BY TimestampColumn DESC 

考虑UTC存储时间 - DateTime.UtcNow

+1

如果表中将来有某些项目,该怎么办? (从这个问题是不明确的,这是否可能。) – svick

+0

谢谢@Jakub K,非常感谢:) – bendr

+0

@svick - 单词'timestamp'和'DateTime.Now'是一个很好的线索;-) –

1

你只已经过去的日期,意思是,你永远有比DateTime.Now新的日期?如果没有,您可以在日期列中选择最新的日期,并通过简单的Order By获得。否则,您需要在DateTime.Now之间获得日期差异,然后按结果排序。例如

SELECT TOP 1 
    columnDate 
FROM table1 
ORDER BY DATEDIFF (ss,@passedInDate,columnDate) 

这将从根本上寻找使用@passedInDate(DateTime.Now)作为限定符基准日的所有未来和过去的日期。在我的示例中,我使用秒作为比较的时间间隔,但您可以将其更改为对您最有意义的任何内容。

此外,您不需要将DateTime.Now传递给SQL服务器,因为您可以使用内置的GetDate()函数。

+0

首先,'ss'不能用单引号。其次,这会返回过去最远的日期,而不是最接近当前日期的日期,因为'DATEDIFF'会为它们返回巨大的负数。 – svick

+0

@svick我改变了。 ;) –

+0

呵呵,我很慢,但第二个问题依然存在。 – svick

3

这里是我的建议:

declare @DateTimeNow datetime = getdate() 

select TOP (1) 
    RecordId 
    ,MyDateColumn 
    ,abs(datediff(s, MyDateColumn, @DateTimeNow)) as Diff 
from 
    MyTable 
order by 
    abs(datediff(s, MyDateColumn, @DateTimeNow)) asc 

不要忘记使用ABS()!

+0

添加ABS()将允许您基于任何日期包含对页面内容的查询,而不仅仅是当前日期(现在),尽管它现在仍然支持就好。 –

+0

我也想添加一个注释,你不能真正使用'ss'(毫秒)来进行这个测试,因为你很可能会发生溢出。你应该使用's'(秒)来防止这种情况发生。 –

1

像这样的东西应该工作:

SELECT TOP 1 * FROM MyTable ORDER BY ABS(DATEDIFF(DD, getdate(), DATE)) 

这应该按照最近的日期,过去或未来对行进行排序。如果您需要更精确,那么只需几天,将DD更改为其他内容,如指定here

+0

你的建议没有得到最接近的,只是排序。添加TOP1。 –