powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / При вычислении времени появляются миллисекунды.
10 сообщений из 10, страница 1 из 1
При вычислении времени появляются миллисекунды.
    #32010129
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При работе с типом данных datetime, когда происходит сложение времени появляются миллисекунды, хотя при заполнении поля их не указываю. И в итоге получается неверный резултат(разница от 1 до 3 сек.). Как окончательно изавиться от миллисекунд? Кто знает подскажите?
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010132
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы бы продемонстрировали как они (миллисекунды) возникают.

У меня к примеру не возникают

declare @d1 datetime,@d2 datetime

select @d1='20010105'

select @d2='00:15:11'

select @d1+@d2

----------------------------------
2001-01-05 00:15:11.000

(1 row(s) affected)
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010168
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример из StoredProc. Используется для формирования отчета. В поле Rolik_len содержится время ролика например '00:02:23'.

SELECT ISNULL(convert(varchar(10),CAST(SUM(CAST(convert(datetime, dbo.Roller.Rolik_len, AS real)) AS datetime), , '---')
FROM dbo.RollerInBlock INNER JOIN
dbo.Roller ON dbo.RollerInBlock.ID_Rolik = dbo.Roller.ID_Rolik INNER JOIN
dbo.Block ON dbo.RollerInBlock.Block_ID = dbo.Block.Block_ID INNER JOIN
dbo.Playlist ON dbo.Block.ID_Playlist=dbo.Playlist.ID_Playlist
WHERE (dbo.Playlist.Playlist_Date =@Date )
AND (dbo.Roller.ID_customer = @ID_Customer)
AND (dbo.Playlist.ID_Channel=@ID_Channel)

--------------------------
1900-01-01 00:14:23.993
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010171
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попроще.
declare @t1 datetime, @t2 datetime, @t3 datetime, @t4 datetime, @t5 datetime
select @t1='00:01:03', @t2='00:00:47', @t3='00:02:19', @t4='00:00:34', @t5='00:04:56'
print convert(varchar(30),cast(cast(@t1+@t2+@t3+@t4+@t5 as real)as datetime),14)
-------------------------------------------------------------------------
00:09:38:997
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010176
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замените real на float. Сравните:
declare @t table(d datetime)

insert @t select '05:55:55'
insert @t select '04:44:44'
insert @t select '03:33:33'
insert @t select '02:22:22'
insert @t select '01:11:11'


select convert(datetime,sum(convert(float,d))) from @t
select convert(datetime,sum(convert(real,d))) from @t
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010185
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал ваш пример. Считает все точно. А в моем примере опять прибавляет миллисекунды.

select convert(datetime,sum(convert(float,Block_len,),14)
from Block
-----------------------------------
1899-12-20 00:09:10.003

(1 row(s) affected)

А при конвертировании в real было:

select convert(datetime,sum(cast(Block_len as real)),14)
from Block
-----------------------------------
1899-12-20 00:09:09.983

(1 row(s) affected)
С float немного точнее, но опять неверно.
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010195
MERLIN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть еще вариант:
set nocount on
declare @t table(d datetime)
insert @t select '05:55:55'
insert @t select '04:44:44'
insert @t select '03:33:33'
insert @t select '02:22:22'
insert @t select '01:11:11'

select dateadd (ss,sum(datediff(ss,'00:00:00', d)),'00:00:00') from @t
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010196
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey!

Ну а что собственно Вы хотите? Время храниться как часть времени суток, т.е. как дробная часть числа. Поскольку количество секунд в сутках не пропорционально никакой степени 10 всегда происходит округление, а при всяких операциях ошибка округления накапливается. И при большей размерности числа это произойдет несколько позже(при большем количестве слагаемых), но произойдет обязательно. Так что просто удивляюсь Вашей наивности в этом вопросе

Что можно сделать? Два варианта

1. Округлять полученный результат
2. Хранить продолжительность в секундах
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010198
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Всем.
...
Рейтинг: 0 / 0
При вычислении времени появляются миллисекунды.
    #32010256
SOVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет не спасибо!
))

Раз пошла такая пьянка...

А вот скажите уважаемые, а каким образом реализованы типы datetime (подобные типы данных) в других СУБД?
Жутко интересно!!!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / При вычислении времени появляются миллисекунды.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]