как DateDiff реализован в Sql Server? - PullRequest
2 голосов
/ 17 декабря 2010

Я использую следующий код в своем заявлении.

datediff(minute, visit.nexttime, visit.endtime)

результаты варьируются.

Я покажу вам пару результатов.

  • 0: 24: 26 - 25
  • 0: 32: 14 - 32
  • 0: 05: 12 - 5
  • 0: 06: 28 - 7
  • 0: 03: 52 - 4
  • 0: 03: 32 - 3

первый, 24 раунда до 25, в то время как есть только 26 секунд.

второй, 32 остается там, где второй 14.

третий, 5 остается 5, достаточно справедливо.

четвертый, 6 раундов до 7, в то время как есть только 28 секунд.

пятый, 3 раунда до 4 унций 52 секунд.

последний, 3 остается 3, даже если г 32 секунды.

Почему это?

Я использую следующий код для получения моего первого столбца.

CONVERT(varchar(6), datediff(second, visit.nexttime, visit.endtime)/3600)
+ ':' + 
RIGHT('0' + CONVERT(varchar(2), (datediff(second, visit.nexttime, visit.endtime) % 3600) / 60), 2)
+ ':' + 
RIGHT('0' + CONVERT(varchar(2), datediff(second, visit.nexttime, visit.endtime) % 60), 2) 
as 'Transaction Time'

Ответы [ 3 ]

1 голос
/ 17 декабря 2010

Datediff немного странный и довольно не интуитивный.И так работает со старых дней Sybase.

В вашем случае datediff (m, x, y) полностью игнорирует секунды.

У вас возникает та же проблема, когда вы пытаетесь вычислить возраст:

select datediff (y, '2010-12-31', '2011-01-01')

не означает, что округленная разница составляет около 1 года, это только говорит о том, что произошел 1 новый год.

Чтобы получить ожидаемые результаты, вы должны принять разницу вболее тонкая основа, как вы делали, используя секунды.

1 голос
/ 17 декабря 2010

Я на самом деле не знаком с SQL Server, однако читаю документацию здесь я подозреваю, что знаю, почему вы получаете такие результаты.

Возвращаемое значение описывается так:

Возвращает количество (целое число со знаком) указанные границы части даты пересекается между указанным начало и конец.

Поскольку вы указали minute для datepart, я ожидаю, что это означает, что секунды игнорируются, и он просто подсчитывает, сколько раз изменяется минута между startdate и enddate.

например.

Если бы startdate и enddate были разнесены на 50 секунд в одну и ту же минуту, было бы возвращено 0.

Если бы startdate и enddate были разнесены всего на 5 секунд, но в разные минуты, он вернул бы 1.

0 голосов
/ 17 декабря 2010

Пожалуйста, обратитесь к документации MySql.Следует уточнить это для вас.

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...