Почему этот INSERT с оператором DATEDIFF работает неправильно?
Вопрос
INSERT INTO timecrunch.dbo.intervals (IntervalID, Duration)
SELECT ixInterval, DATEDIFF(hour, dtStart, dtEnd) FROM fogbugz.dbo.TimeInterval
WHERE dtEnd is not NULL
IntervalID — целое число, Duration — число с плавающей запятой.
Я пытаюсь поместить всю почасовую продолжительность в столбец «Продолжительность»...Я предполагаю, что даже если это меньше часа, будет использоваться дробь, поэтому я ставлю число с плавающей запятой?
Помощь.
ПС:Все работает нормально, ошибок нет, но после завершения таблица интервалов все еще пуста...Я знаю, что данные находятся в таблице TimeInterval...
Решение
Я не уверен, почему ваши данные не отображаются, но DATEDIFF не возвращает число с плавающей запятой.Чтобы получить число с плавающей запятой, вы, вероятно, захотите использовать меньшую единицу времени и разделить ее на количество единиц в минуту.Пример:
DATEDIFF(second, dtStart, dtEnd) / (3600.0)
Другие советы
DATEDIFF возвращает Int количества пересеченных границ частей даты.Я ожидаю, что вы получите минимальное количество часов, если только не возникнет проблема с неявным преобразованием из Int в Float.
Также полезно опубликовать полученное сообщение об ошибке.
Чтобы вставить фактические доли часа, используйте:
INSERT INTO timecrunch.dbo.intervals (IntervalID, Duration)
SELECT
ixInterval,
DATEDIFF(mi, dtStart, dtEnd) / 60.0
FROM
fogbugz.dbo.TimeInterval
WHERE
dtEnd is not NULL
DATEDIFF всегда возвращает значение INT, а не дробь.
Попробуйте запустить SELECT отдельно с битом INSERT, чтобы убедиться, что ваш запрос действительно возвращает некоторые данные.
Редактировать:Как говорили другие, DATEDIFF возвращает целое число, а не число с плавающей запятой, но это не должно помешать INSERT вставить некоторые данные.
Во-первых, какие результаты вы получаете, просто выполнив выбор?
В SQL Server Dateediff возвращает Int (См. MSDN)
DATEDIFF вернет целое число, а не число с плавающей запятой. Это проблема, с которой вы столкнулись?