Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Здравствуйте господа! Предложите простое округление, или придется разбивать на составляющие дату число, и затем подставлять кратное число минут секунд?

данные есть такие:
SELECT Convert(datetime, '2011-02-22 03:29:54') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 03:57:30') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 04:29:28') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 04:57:27') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 05:29:37') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 05:59:13') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 06:09:32') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 06:59:34') AS t UNION ALL
SELECT Convert(datetime, '2011-02-22 07:23:59') AS t


Округлить надо до:
2011-02-22 03:30:00
2011-02-22 04:00:00
2011-02-22 04:30:00
2011-02-22 05:00:00
2011-02-22 05:30:00
...
28 дек 11, 14:35    [11839649]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Переводите время в минуты, округляйте до кратного, потом назад.
28 дек 11, 14:38    [11839676]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
libru
Member

Откуда:
Сообщений: 877
можно найти количество секунд, прошедшее с 1 января 1970 года...
28 дек 11, 14:38    [11839677]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
f50
Здравствуйте господа! Предложите простое округление, или придется разбивать на составляющие дату число, и затем подставлять кратное число минут секунд?

данные есть такие:
SELECT Convert(smalldatetime, '2011-02-22 03:29:54') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 03:57:30') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 04:29:28') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 04:57:27') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 05:29:37') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 05:59:13') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 06:09:32') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 06:59:34') AS t UNION ALL
SELECT Convert(smalldatetime, '2011-02-22 07:23:59') AS t


Округлить надо до:
2011-02-22 03:30:00
2011-02-22 04:00:00
2011-02-22 04:30:00
2011-02-22 05:00:00
2011-02-22 05:30:00
...
28 дек 11, 14:43    [11839734]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
f50,

и старайтесь не применять строковый формат даты, зависящий от локальных настроек
28 дек 11, 14:45    [11839761]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
libru
Member

Откуда:
Сообщений: 877
чета я не доганяю чем поможет smalldatetime
28 дек 11, 14:46    [11839776]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
libru
чета я не доганяю чем поможет smalldatetime
Тем, что в этом типе 0 секунд...
28 дек 11, 14:55    [11839873]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
libru
Member

Откуда:
Сообщений: 877
iap
libru
чета я не доганяю чем поможет smalldatetime
Тем, что в этом типе 0 секунд...
у автора в желаемом результате не только секунды нулевые, но и вторая циферка в минутах - тоже
28 дек 11, 14:57    [11839890]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
libru
iap
пропущено...
Тем, что в этом типе 0 секунд...
у автора в желаемом результате не только секунды нулевые, но и вторая циферка в минутах - тоже
Упс!
Посыпаю голову пеплом.
28 дек 11, 14:59    [11839905]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
with x as
(
 SELECT Convert(datetime, '20110222 03:29:54') AS t UNION ALL
 SELECT Convert(datetime, '20110222 03:57:30') AS t UNION ALL
 SELECT Convert(datetime, '20110222 04:29:28') AS t UNION ALL
 SELECT Convert(datetime, '20110222 04:57:27') AS t UNION ALL
 SELECT Convert(datetime, '20110222 05:29:37') AS t UNION ALL
 SELECT Convert(datetime, '20110222 05:59:13') AS t UNION ALL
 SELECT Convert(datetime, '20110222 06:09:32') AS t UNION ALL
 SELECT Convert(datetime, '20110222 06:59:34') AS t UNION ALL
 SELECT Convert(datetime, '20110222 07:23:59') AS t
),
x1(t, t1, m, s) as
(
select
 t,
 dateadd(minute, 30, t),
 datepart(minute, dateadd(minute, 30, t)),
 datepart(second, dateadd(minute, 30, t))
from
 x
)
select
 dateadd(second, -s, dateadd(minute, -case when m > 30 then m - 30 else m end, t1))
from
 x1;
28 дек 11, 15:03    [11839946]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
          SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T03:29:54'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T03:57:30'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T04:29:28'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T04:57:27'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T05:29:37'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T05:59:13'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T06:09:32'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T06:59:34'),126)+'0:00' AS DATETIME)
UNION ALL SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T07:23:59'),126)+'0:00' AS DATETIME);
28 дек 11, 15:10    [11839992]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
f50
Member

Откуда: Россия
Сообщений: 456
Спасибо! Вариант выберу себе! Вариант от iap:
SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T03:29:54'),126)+'0:00' AS DATETIME)

идеально подходит, правда у меня разнос есть более 5 минут, но это я подработаю. Всех с новым годом!!!
28 дек 11, 15:27    [11840148]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
f50
Спасибо! Вариант выберу себе! Вариант от iap:
SELECT CAST(CONVERT(VARCHAR(15),DATEADD(MINUTE,5,'2011-02-22T03:29:54'),126)+'0:00' AS DATETIME)

идеально подходит, правда у меня разнос есть более 5 минут, но это я подработаю. Всех с новым годом!!!
Какой ещё разнос?!!!
5 минут для округления к ближайшему десятку минут надо!
28 дек 11, 15:30    [11840179]     Ответить | Цитировать Сообщить модератору
 Re: Округлить дату (2011-12-04 06:07:57>2011-12-04 06:00:00)  [new]
Горилла с Нижнего Тагила
Member

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

автор, похоже до 30 мин округляет. И где-то бывает, "разнос" более 5 мин. Получается 20 или 40.
29 дек 11, 11:25    [11844410]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить