在C#中枚举所有(全)时间从start
到end
:
public static IEnumerable<DateTime> Hours(DateTime start, DateTime end)
{
start -= TimeSpan.FromMinutes(start.TimeOfDay.TotalMinutes);
end -= TimeSpan.FromMinutes(end.TimeOfDay.TotalMinutes);
return Enumerable.Range(0, (int)Math.Ceiling((end - start).TotalHours))
.Select(x => begin + TimeSpan.FromHours(x));
}
首先我们从间隔边界删除分钟,我们需要整个时间内只(所以10:30和11:10将导致两个小时,而不仅仅是它们之间的差异)。然后我们创建一个从零到整数小时的枚举,我们将使用它从头开始创建偏移量。我保留开始DateTime
使用计算的TimeSpan
作为偏移来跟踪日期更改(例如,如果区间边界跨越两天或更多天)。
如果,例如,start
是2014/04/01 10:25
和end
是2014/04/01 13:20
,那么你会得到:
2014/04/01 10:00
2014/04/01 11:00
2014/04/01 12:00
2014/04/01 13:00
得到的只是部分时间变化返回类型IEnumerable<TimeSpan>
和最后一个Select()
到:
.Select(x => (begin + TimeSpan.FromHours(x)).TimeOfDay);
在SQL中可以完成,但它有点棘手,因为你需要一个带有整数序列的工作表。请注意以下代码未经测试。
首先,你需要计算的区别:
CEIL(TIMESTAMPDIFF(MINUTE, startDate, endDate)/60)
现在你可以使用写满数字的偏移量的工作表:
Value
-----
0
1
2
3
...
有了这个:
SELECT
DATE_ADD(startDate, INTERVAL Value HOUR)
FROM
NumericTable
WHERE
Value <= CEIL(TIMESTAMPDIFF(MINUTE, startDate, endDate)/60)
在这两种情况(C#和SQL)都可以替换输出DateTime
/Date
w ith一个TimeSpan
/TIME
对象)。
这是最接近我想要做的感谢:) – JazziJeff