我有点困惑如何或什么最好的方式来确定最接近的日期是DateTime.Now
是。如何确定最近的日期
在我的表中,一切都需要加时间戳。并且在一个页面上,只有当日期是最接近的日期时,我才能够从表中检索所有内容。
我该怎么办?
插入日期到数据库中,当我使用DateTime.Now
,格式是这样的:
5/07/2011 5:28:57 PM
我有点困惑如何或什么最好的方式来确定最接近的日期是DateTime.Now
是。如何确定最近的日期
在我的表中,一切都需要加时间戳。并且在一个页面上,只有当日期是最接近的日期时,我才能够从表中检索所有内容。
我该怎么办?
插入日期到数据库中,当我使用DateTime.Now
,格式是这样的:
5/07/2011 5:28:57 PM
你只已经过去的日期,意思是,你永远有比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()
函数。
这里是我的建议:
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()!
添加ABS()将允许您基于任何日期包含对页面内容的查询,而不仅仅是当前日期(现在),尽管它现在仍然支持就好。 –
我也想添加一个注释,你不能真正使用'ss'(毫秒)来进行这个测试,因为你很可能会发生溢出。你应该使用's'(秒)来防止这种情况发生。 –
在T-SQL,您可以使用则DateDiff:
DATEDIFF (datepart , startdate , enddate)
http://msdn.microsoft.com/en-us/library/ms189794.aspx
或在C#中,你可以使用时间跨度:
http://msdn.microsoft.com/en-us/library/system.timespan.aspx#Y3719
像这样的东西应该工作:
SELECT TOP 1 * FROM MyTable ORDER BY ABS(DATEDIFF(DD, getdate(), DATE))
这应该按照最近的日期,过去或未来对行进行排序。如果您需要更精确,那么只需几天,将DD更改为其他内容,如指定here
你的建议没有得到最接近的,只是排序。添加TOP1。 –
'最接近'表示四舍五入,即下午11点将是下一天。这不是习惯,通常我们会截断时间戳以找到日期。 –
是的!我知道我已经忘记了我想要的更好的词 – bendr