Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Функция округления времени  [new]
borusik
Member

Откуда:
Сообщений: 23
Всем добрый день
У меня есть процесс который вносит данные в таблицу каждые 15 мин.
Я пишу процедуру, которая принимает время ( в мин, часах, неделях)
Например я хочу данные за последние 15 мин, а сеичас допустим 9:26, значит процедура должна мне вернуть данные 9:00 до 9:15, то есть последнее обновление было в 9:15 и от этого времени надо взять 15 мин, или любое время запроса (например если я хочу последние 30 мин, тогда интервал 8:45-9:15)
Есть ли какая нибудь функция, которая округляет на 15 (0,15,30,60) ?
24 авг 09, 10:18    [7571669]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
vino
Member

Откуда:
Сообщений: 1191
borusik, если не думать о совместимости, то можно время перевести во флоат и округлить до нужной точности.
Но в данном случае, так как условия округления не ясны, формулу не приведу.
Вам нужно получить, в данном примере скорее всего, две переменные с округленным временем и выполнить запрос.
В конце концов, даже CASE достаточно, чтобы определить округление к четырем значениям в часе
24 авг 09, 10:27    [7571714]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
borusik
Member

Откуда:
Сообщений: 23
В том то и вопрос, как округлить время
а Вы имели ввиду 00-15, 15-30, 30-45, 45-00 ?
24 авг 09, 10:56    [7571831]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Коллега а в чем проблема? Берете значение минут и определяете в какой из 4 полуинтервалов оно входит.
24 авг 09, 11:02    [7571853]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алгоритм округления числа X с точностью до Y такой
1. делим X на Y
2. берем целую часть от деления и умножаем на Y
24 авг 09, 11:08    [7571895]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
declare @dt datetime
set @dt = '20090824 23:54:47'
--set @dt = '20090824 00:00:47'
--set @dt = '20090824 00:07:29'
--set @dt = '20090824 00:07:30'
--set @dt = '20090824 00:15:00'
--set @dt = '20090824 00:15:01'

select dateadd(ms, round(datediff(ms, startdate, dt) / 900000. , 0) * 900000.
              ,startdate
              ) as result
  from (select @dt as dt
              ,convert(char(8), @dt, 112) as startdate
        ) as t
24 авг 09, 11:15    [7571928]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
iljy
Member

Откуда:
Сообщений: 8711
borusik,

declare @dt datetime
set @dt = '20090824 23:54:47'

select dateadd(mi, datediff(mi, 0, @dt) /15 * 15, 0)
24 авг 09, 13:49    [7572888]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
borusik
Member

Откуда:
Сообщений: 23
а как можно число (в секундах) - 129.7 - перевести в 00:02:09.7 (HH:MM:SS.ms)
26 авг 09, 12:43    [7581381]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36826
borusik
а как можно число (в секундах) - 129.7 - перевести в 00:02:09.7 (HH:MM:SS.ms)
Операциями деления и склеивания строки.

Сообщение было отредактировано: 26 авг 09, 12:47
26 авг 09, 12:46    [7581419]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
borusik
а как можно число (в секундах) - 129.7 - перевести в 00:02:09.7 (HH:MM:SS.ms)
добавить 129700 миллисекунд функцией DATEADD(MILLISECOND,129700, ...) к дате с нулевым временем, смотреть подходящим CONVERTом.
26 авг 09, 12:52    [7581476]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
borusik
Member

Откуда:
Сообщений: 23
но это же примитивно,
я вот что сделал
CONVERT(char(100),dateadd(second,129.7, 108)
вопрос, как 7 вычеслить ?
26 авг 09, 12:55    [7581497]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
Glory
Member

Откуда:
Сообщений: 104760
borusik
но это же примитивно,
я вот что сделал
CONVERT(char(100),dateadd(second,129.7, 108)
вопрос, как 7 вычеслить ?

Вы знаете, что такое округление до целого ? А что такое вычитание результата округления из начального числа
26 авг 09, 12:57    [7581508]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
borusik
но это же примитивно,
я вот что сделал
CONVERT(char(100),dateadd(second,129.7, 108)
вопрос, как 7 вычеслить ?

т.е. все что примитивно - не стоит вашего внимания?
26 авг 09, 13:03    [7581543]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
CONVERT(char(100),dateadd(ms,129.7 * 1000, 108)
это примитивно? зато минимум операций.

для спящего время бодрствования равносильно сну
26 авг 09, 13:04    [7581553]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Не вижу ничего примитивного также и в предложении Сергея Алексеевича
Если я правильно понял, он имел в виду нечто такое:
declare @n decimal(7, 1)
set @n = 129.7

select replace(str(i / 3600, 2) 
               + ':' + str(i % 3600 / 60, 2) 
               + ':' + str(i % 60, 2)
               + '.' + str(cast((n - i) * 1000 as int), 3)
               ,' ', '0') as result
  from (select @n n, cast(@n as int) i) t

result
-------------------
00:02:09.700

(1 row(s) affected)
26 авг 09, 13:12    [7581613]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
borusik
Member

Откуда:
Сообщений: 23
Спасибо за варианты и ИЗВЕНИТЕ если кого либо обидел
26 авг 09, 13:39    [7581813]     Ответить | Цитировать Сообщить модератору
 Re: Функция округления времени  [new]
MsDatabaseru
Member

Откуда: Hobby.MsDatabase.ru
Сообщений: 10937
select current_dt = getdate() 
, rounded15min = cast(round(cast(getdate() as money)  * 96.0   ,0,1)/96.0 as datetime) + '0:00:00.003'
-- 96 = 24 * 4 
-- 1hour = 15 min * 4
26 авг 09, 15:01    [7582334]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить