2014-04-01 27 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值。

相关问题