在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