返回两个时间之间的实际时间

本文关键字:时间 之间 两个 返回 | 更新日期: 2023-09-27 17:55:36

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

似乎啰嗦:(

返回两个时间之间的实际时间

在 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 将导致两个小时,而不仅仅是它们之间的差异)。然后我们创建一个从零到整小时数的枚举,我们将使用它从头开始创建偏移量。我使用计算TimeSpan作为偏移量来跟踪日期更改(例如,如果间隔边界跨越两天或更长时间),DateTime保持开始。

例如,如果start 2014/04/01 10:25并且end 2014/04/01 13:20,那么您将获得:

2014/04/01 10:002014/04/01 11:002014/04/01 12:002014/04/01 13:00

若要获取实时部分,请将返回类型更改为 IEnumerable<TimeSpan>,并将最后Select()更改为:

.Select(x => (begin + TimeSpan.FromHours(x)).TimeOfDay);

在SQL中可以做到这一点,但它有点棘手,因为您需要一个带有整数序列的工作表。请注意,以下代码未经测试。

首先,您需要计算该差值:

CEIL(TIMESTAMPDIFF(MINUTE, startDate, endDate) / 60)

现在,您可以使用填充数字的工作表进行偏移:

价值-----0123...

有了这个:

SELECT
    DATE_ADD(startDate, INTERVAL Value HOUR)
FROM 
    NumericTable
WHERE
    Value <= CEIL(TIMESTAMPDIFF(MINUTE, startDate, endDate) / 60)

在这两种情况下(C# 和 SQL),您可以将输出DateTime/Date替换为 TimeSpan/TIME 对象)。

我建议使用DateTime和TimeSpan类。您可以使用它:

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

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

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