Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DateDiff округляет год! 
:(
    Опции темы
MadCoder
  Дата 12.8.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: нет
Всего: 2



Использую DateDiff в MS SQL Server 2005, однако недавно натолкнулся на неожиданность: он округляет до следующего целого значения. В случае, если это год, выглядит совсем некорректно. Проведем эксперимент, выполнив 3 запроса:

Код

select getdate()

Результат: 2009-08-12 10:26:21.177.

Код

select datediff(year,'1984-11-22 00:00:00',getdate())

Результат: 25 (хотя должно быть 24).

Код

select datediff(month,'1984-11-22 00:00:00',getdate())/12

Результат: 24 (тут подсчитал правильно).

Коллеги, неужели DateDiff округляет значения в в большую сторону? smile  Тыщу лет им пользовался, думал он точно считает (да и в MSDN об этом ничего нет).
PM WWW ICQ   Вверх
azesmcar
Дата 12.8.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: нет
Всего: 211



Цитата(MadCoder @  12.8.2009,  09:29 Найти цитируемый пост)
Результат: 25 (хотя должно быть 24).

 smile 
2009-1984=25
О каком округлении идет речь? Это ты округляешь (точнее игнорируешь дробную часть) во втором случае, вот и получаешь 24 вместо 25-и.
В месяцах получается 24*12+(11-8)=291, 291/12=24.25 (убираем дробную часть) = 24

Это сообщение отредактировал(а) azesmcar - 12.8.2009, 09:52
PM   Вверх
MadCoder
Дата 12.8.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: нет
Всего: 2



Цитата(azesmcar @ 12.8.2009,  09:42)
Цитата(MadCoder @  12.8.2009,  09:29 Найти цитируемый пост)
Результат: 25 (хотя должно быть 24).

 smile 
2009-1984=25
О каком округлении идет речь? Это ты округляешь (точнее игнорируешь дробную часть) во втором случае, вот и получаешь 24 вместо 25-и.
В месяцах получается 24*12+(11-8)=291, 291/12=24.25 (убираем дробную часть) = 24

Т.е. DateDiff не учитывает, что дата еще не наступила (по логике, 25 лет будет в 11 месяце, а сейчас 8)?
PM WWW ICQ   Вверх
azesmcar
Дата 12.8.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: нет
Всего: 211



Цитата(MadCoder @  12.8.2009,  10:48 Найти цитируемый пост)
Т.е. DateDiff не учитывает, что дата еще не наступила (по логике, 25 лет будет в 11 месяце, а сейчас 8)? 

нет, он выделяет год из обоих дат и возвращает разницу.
PM   Вверх
Akina
Дата 12.8.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(azesmcar @  12.8.2009,  11:51 Найти цитируемый пост)
он выделяет год из обоих дат 

Не выделяет, а приводит к заданному интервалу ('1984-11-22 00:00:00' = 1984,89315) и округляет до целого. Потом вычитает. Это только в случае года что приведение, что выделение, дают один и тот же результат.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
azesmcar
Дата 12.8.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: нет
Всего: 211



Цитата(Akina @  12.8.2009,  11:27 Найти цитируемый пост)
Не выделяет, а приводит к заданному интервалу ('1984-11-22 00:00:00' = 1984,89315) и округляет до целого. Потом вычитает. Это только в случае года что приведение, что выделение, дают один и тот же результат. 

А мы о каком случае говорим? В итоге он это и делает, алгоритм я не знаю, в MSDN этого не написано.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0798 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.