2016-05-13 4 views
2

Я думал, что это будет просто, но у меня есть проблема.Получение секунд после последней записи

SELECT DATEDIFF (s,getdate(), max(TimeCreated)) as difference 
FROM Ens.MessageHeader 

Мое предположение состояло в том, что это будет показывать разницу между текущим временем и меткой времени самой последней записи. Если я его выполню, я получаю что-то похожее на 15057, которое может быть правильным. Однако в следующий раз, когда я его выполнил, он будет ниже. Никаких новых записей не было. Прямо сейчас он находится в 15024. Все еще нет новых записей. Самая недавняя временная метка в настоящее время 2016-05-13 08:51:16

Идея в том, что я могу посмотреть этот счетчик, и когда он сбрасывается до нуля, я знаю, что есть новое сообщение.

Что мне не хватает?

Update Я добавил некоторые дополнительные данные для запроса, чтобы помочь увидеть, что происходит:

SELECT getDate() as now, max(TimeCreated) as latest, DATEDIFF (s,getdate(), max(TimeCreated)) as difference 
FROM Ens.MessageHeader 

Вот несколько наборов результатов:

now     latest    difference 
------------------- ------------------- ---------- 
2016-05-13 09:50:45 2016-05-13 08:51:16 14431  
2016-05-13 09:52:29 2016-05-13 08:51:16 14327  
2016-05-13 09:52:50 2016-05-13 08:51:16 14306  
+0

Когда я выполняю тот же код в своей таблице, у которого есть значение даты, я получаю отрицательное число секунд назад. – GendoIkari

ответ

4

Полученная информация связана с порядком аргументов при вашем вызове DATEDIFF() И тот факт, что TimeCreated - это временная метка UTC, которая в некоторых ситуациях преобразуется в локальное время, но похоже, что она не преобразуется, когда внутри DATEDIFF. Таким образом, ваш запрос, как написано, выглядит так: MAX(TimeCreated + UTC_offset) - getdate(), что является положительным числом, которое становится меньше.

Как сказано в ответе @Gordon Linoff, вы должны иметь MAX(TimeCreated) как второй аргумент DATEDIFF, так как это время начала разницы. Вы также, вероятно, хотите, чтобы обернуть, что в функции %EXTERNAL сделать 110% уверен, что он преобразуется в локальное время перед запуском сравнения:

SELECT DATEDIFF(second, %EXTERNAL(MAX(TimeCreated)), getdate()) 
FROM Ens.MessageHeader 

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

Все, что сказал, я не уверен, что поведение DATEDIFF() связано с принятием значения предварительного преобразования или ошибкой.

+0

'% EXTERNAL()' сделал трюк, спасибо! –

0

Это любопытно. Что происходит, так это то, что TimeCreated находится в «будущем». DATEDIFF(x, <exp1>, <exp2>) рассчитывает разницу <exp2> - <exp1>.

Так что, если TimeCreate должен быть в прошлом, то вы можете попробовать:

SELECT DATEDIFF(second, max(TimeCreated), getdate()) 
FROM Ens.MessageHeader; 

Затем вы получите отрицательное число и интересно, что происходит. По прошествии более секунд отрицательное число идет к нулю, потому что текущая дата/время приближается к max(TimeCreated).

Я предполагаю, что у вас есть проблема с часовым поясом. Или у вас есть предвзятость, которая влияет на TimeCreated. Вы можете получить review other ways получения текущего значения даты/времени.

+0

См. Обновление. Я на наркотики? –

Смежные вопросы