2014-04-01 24 views
1

我想在兩次之間返回實際小時值的那一刻我有一個相當有趣的問題。我不介意如果這是在C#或MySQL,但我不知道該怎麼辦。返回兩次之間的實際小時數

例如,時間1 = 13:00 &時間2 = 18:10

我想返回13:00,14:00,15:00,16:00,17:00,18:00

有很多用於計算兩次之間的小時計數,我知道我可以使用該整數值,並增加我的基準小時,但我想知道是否有更清潔的方式?

Mysql的

timediff('2014-04-01 18:10:00', '2014-04-01 13:00:00') 

回報五點10分00秒

hour('2014-04-01 13:00:00') 

收益按小時值13

增量的13

似乎長篇大論:(

回答

0

在C#中枚舉所有(全)時間從startend

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作爲偏移來跟蹤日期更改(例如,如果區間邊界跨越兩天或更多天)。

如果,例如,start2014/04/01 10:25end2014/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對象)。

+0

這是最接近我想要做的感謝:) – JazziJeff

0

我建議使用DateTime和TimeSpan類。你可以使用這個:

double HoursBetween(DateTime t1, DateTime t2) 
{ 
    return (t2 - t1).TotalHours; 
} 

如果你需要int返回類型,你可能想要應用一些舍入。

發生了什麼是定義了兩個DateTime對象的 - 運算符,因此將創建一個包含時間差的TimeSpan對象。 TotalHours只是返回在整個和小數小時內表示的TimeSpan值。

相關問題