2017-01-07 7 views
0

У меня есть Дата (2017-01-07) и времени (23:58:06 PM) Два столбца, я попробовал по указанному ниже QueryКак получить последние 2 часа записи из SQL Server

SELECT * FROM Report WHERE Time > DATEADD(HOUR, -2, GETDATE()) 

Время is NVARCHAR, DATE is Date

Но я получаю сообщение об ошибке «Не удалось преобразовать при преобразовании даты и/или времени из символьной строки».

Пожалуйста, помогите мне решить эту проблему !!! Я являюсь стартером SQL

+4

, что тип данных является 'столбец Time'? Можете ли вы показать DDL/схему, чтобы мы поняли эту идею? – dlatikay

ответ

0

Похоже, что время является полем ТЕКСТ.

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

Этот ответ в SO может помочь: https://stackoverflow.com/a/7289875/3270427

SELECT * 
FROM Report 
WHERE CAST(Date AS DATETIME) + CAST(Time AS DATETIME) >= DATEADD(HOUR, -2, GETDATE()); 
+0

Я использую Time column как NVARCHAR, он содержит как AM/PM. –

+0

Да в соответствии с вашим предложением я объединил дату и время, и теперь этот запрос работает хорошо ...! Спасибо..! –

1

Что вы хотите сделать, это добавить их вместе, а затем сравнить, чтобы получить дату. К сожалению, вы не можете добавить date и time вместе. К счастью, вы можете добавить datetime и time вместе.

Итак:

WHERE (CAST(date as datetime) + time) >= DATEADD(HOUR, -2, GETDATE()) 

Если time является символ, то вы должны быть в состоянии преобразовать это также:

WHERE (CAST(date as datetime) + CAST(time as time)) >= DATEADD(HOUR, -2, GETDATE()) 

Или, если ПМ избыточно часть time, то:

WHERE (CAST(date as datetime) + CAST(LEFT(time, 8) as time)) >= DATEADD(HOUR, -2, GETDATE()) 

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

alter table report add datetimecol as (CAST(date as datetime) + time); 
create index idx_report_datetimecol on report(datetimecol); 

EDIT:

Вы, кажется, есть проблема с вашими данными. Попробуйте:

select time 
from report 
where try_convert(time, timecol) is null; 

или:

select time 
from report 
where try_convert(time, left(timecol, 8)) is null; 

Если столбец дата также строка (очень плохая идея, чтобы не использовать собственные типы данных), а затем проверить, что хорошо.

+0

Спасибо за полезный ответ, но все же я получаю ту же ошибку с этой ошибкой (столбец «datetimecol» в таблице «Отчет» не может использоваться в индексе или статистике или в качестве ключа раздела, поскольку он не является детерминированным.), Это таблица обновляет каждые 5 минут непрерывно с помощью скрипта, поэтому то, что я сделал на время, - это выбрать 300 строк, чтобы показать последний отчет за 2 часа. –

+0

@ T.Anand. , , Ну, по крайней мере, вы изучаете урок, чтобы использовать встроенные типы данных. Они там не просто так. Теперь вам нужно искать неверно структурированные строки. –

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