Каков наилучший способ представления временного интервала в SQL Server CE? - PullRequest
26 голосов
/ 05 апреля 2009

Говоря конкретно, мне нужны только часы: минуты, но говорят, что у меня есть объект .NET TimeSpan. Как мне сохранить его в базе данных SQL (CE)?

Ответы [ 4 ]

38 голосов
/ 13 апреля 2009

Я бы рекомендовал использовать long для представления числа тиков . Это то, что TimeSpan использует в качестве внутреннего представления. Это позволяет вам легко воссоздать ваш объект с помощью метода Timespan.FromTicks () и вывести его в базу данных, используя свойство Timespan.Ticks . Наименьшая единица времени в .NET - это отметка, равная 100 наносекундам

2 голосов
/ 31 августа 2010

Хранить как варчар. Сохранить в sql используя TimeSpan.ToString(). Читайте из sql как:

TimeSpanObj = TimeSpan.Parse(fieldValue)
1 голос
/ 05 апреля 2009

SQL CE не имеет типа времени или определенных пользователем типов, поэтому вы можете выбрать datetime или int, представляющие минуты. Если наибольшее время, которое вам нужно сохранить, составляет 23:59 = 23 * 60 + 59 = 1439 = количество минут в дне, начиная с минуты 0, smallint - это наименьший целочисленный тип, который будет соответствовать этому диапазону.

Не поддавайтесь искушению хранить часы и минуты в отдельных столбцах в виде миниатюр. При этом использовалось бы то же пространство, что и для единственного smallint, но тогда для каждого вычисления времени потребуется умножить часы на 60 и добавить минуты, а для каждого order by потребуется два столбца вместо одного.

Хранить в минутах; на дисплее вы можете разделить минуты на часы и минуты с помощью

select floor( absminutes / 60 ) as hours, absminutes % 60 as minutes,
from some table
order by absminutes; 

Я бы назвал столбец (столбцы) minutes или absminutes (для абсолютных минут), если вы хотите отличить 1439 минут в день от 0-59 минут в час.

Чтобы преобразовать значение базы данных в объект Timespan, используйте ctor Timespan(int, int, int), например, new TimeSpan( floor(absminutes / 60 ), absminutes % 60, 0) или (лучше) ctor Timespan(long) с new Timespan( absminutes * TimeSpan.TicksPerMinute ).

Чтобы вставить или обновить базу данных из объекта Timespan, установите absminutes на someTimespan.TotalMinutes % 1440.

0 голосов
/ 22 апреля 2015

В настоящее время я рассматриваю возможность использования SQL Time для этого, но он не будет работать в течение> = 24 часов.

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

declare @delay table (DelayTime Time(3))
insert into @delay values ('00:10:00.000')
select getdate() as nowtime, getdate()+DelayTime as nowPlusTen from @delay

и

SqlDataReader dr = cmd.ExecuteReader();
DelayTime = (TimeSpan) dr["DelayTime"];
...