Как добавить плавающие числа в виде часов и вывести часы с минутами и секундами - PullRequest
3 голосов
/ 02 октября 2010

У меня простая проблема, у меня время в двойном формате.т.е. 1,20 ч.2,30 ч.3.40 ч.

Я хочу добавить их как часы, а не как числа с плавающей запятой, т.е. к основанию 60.например

1,20 + 2,30 + 3,40 = 7,30 часа (правильно)

1,20 + 2,30 + 3,40 = 6,90 (неверно)

Я хочу это как в SQL и C #В настоящее время я использую пользовательские функции с обеих сторон.Я хочу знать любой самый простой способ сделать это.

Если я сохраняю это в неправильном формате, пожалуйста, скажите мне, как сделать это правильно, в основном я получаю разницу между двумя датами в виде числа с плавающей запятой.

Все возможные решения приветствуются.

Ответы [ 6 ]

0 голосов
/ 02 октября 2010

Это действительно плохая идея, чтобы рассчитать дату и время на вашем пути. Вот что вы хотите:

    double original = 1.55d+2.9d+3.48d;
    double carry = (int)(original * 100) % 100 / 60;
    double result = original + carry - carry / 100 * 60;
0 голосов
/ 02 октября 2010

Ну, сборка .NET может называться хранимой процедурой на сервере SQL, поэтому ваше решение может быть написано на C #

Я бы использовал объект TimeSpan для такого рода вычислений, как уже было показано Джономс некоторым дополнительным комфортом:

public static TimeSpan AddMinutes(this TimeSpan span, double mins)
{
  return span.Add(TimeSpan.FromMinutes(mins));
}

public static string ToHourAndMins(this TimeSpan span)
{
  return string.Format("{0}:{1:00}", Math.Truncate(span.TotalHours), span.Minutes);
}

Тогда вы можете сделать:

var ts = TimeSpan.FromMinutes(20);
ts = ts.AddMinutes(45);
Console.WriteLine(ts.ToHourAndMins());
0 голосов
/ 02 октября 2010

Если возможно, попробуйте изменить формат на более разумный.Либо общее количество минут, либо одно поле для часов и одно для минут.Это облегчит вашу жизнь.

0 голосов
/ 02 октября 2010

Вот способ сделать это в SQL.Подзапрос ConvertedData разбивает ваш формат времени на минуты и часы.Внешний запрос суммирует их вместе и преобразует обратно в формат с плавающей запятой:

select  sum(hours) + sum(minutes) / 60 as TotalHours
,       sum(minutes) % 60 as TotalMinutes
,       sum(hours) + sum(minutes) / 60 + sum(minutes) % 60.0 / 100 as YourDt
from    (
        select  cast(YourDt % 1 * 100 as int) as minutes
        ,       cast(YourDt as int) as hours
        from    (
                select  1.2 as YourDt
                union all
                select  2.3
                union all
                select  3.4
                ) SourceData
        ) ConvertedData

Это печатает:

TotalHours  TotalMinutes  YourDt
7           30            7.300000
0 голосов
/ 02 октября 2010
double wholeHours = Math.Floor(timeVal);
TimeSpan realTime = new TimeSpan(wholeHours, (timeSpan - wholeHours) * 100 / 60;

Вы говорите "sql", который предложил бы использовать тип данных TIME, однако я предполагаю (поскольку он наиболее распространен в C #), что вы имеете в виду SQLServer, который, увы, не поддерживает тип данных TIME до 2008 года, поэтомуможет быть недоступен для вас, и в этом случае вам придется продолжать использовать поплавок и установить для него реальное количество часов с помощью

FLOOR(timeVal) + (timeVal - FLOOR(timeVal)) * 100 / 60
0 голосов
/ 02 октября 2010

Я думаю, что нет "быстрого" (читай: встроенного) способа. Тебе придется сделать это самому.

  • Разделить числа: часть «целое число» - это час, дробь (x 100) - минуты
  • добавить часы и минуты отдельно
  • получить "целые часы" из подсчета минут и настроить счетчик часов и минут
  • сложить части вместе: часы + минуты / 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...