返回两次之间的实际小时数

时间:2014-04-01 09:05:18

标签: c# mysql

我想在两次之间返回实际小时值的那一刻有一个相当有趣的问题。我不介意这是在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' ) 

返回05:10:00

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

返回13

以小时值

递增13

看起来很啰嗦:(

2 个答案:

答案 0 :(得分:0)

我建议使用DateTime和TimeSpan类。你可以用这个:

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

如果需要int返回类型,可能需要应用一些舍入。

正在发生的事情是定义了两个DateTime对象的 - 运算符,因此创建了一个保存时差的TimeSpan对象。 TotalHours只返回以整数小时和小时数表示的TimeSpan值。

答案 1 :(得分: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替换为TimeSpan / TIME对象。