2010-12-05 2 views
1

Как проверить, равны ли 2 дате в sql-скрипте?Сравнение дат в SQL Server

Значение, переданное от переднего конца является «2010-12-04 22:14:49» и дата в таблице «2010-12-04 22: 14: 49,253»

Я не заботиться о миллисеку. Я попробовал этот

DATEDIFF(SS,'2010-12-04 22:14:49','2010-12-04 22:14:49.253') = 0 

и получил следующее сообщение об ошибке

Функция DateDiff привела в переливом. Число дат , разделяющее два экземпляра даты/времени, равно слишком велико. Попытайтесь использовать датифф с менее точной датой.

+1

Я не получаю эту ошибку с вашим образцом. –

ответ

2

На мой SQL Server (2008 R2) этот фрагмент кода T-SQL работает нормально ....

Вы уверены, что не вводил опечатка (например 1010-12-04......) ваши даты как-то , так что расстояние между двумя датами будет действительно действительно большим?

Тогда количество секунд между ними могут действительно перелив даже большой числовой диапазон SQL Server - и это именно то, что сообщение об ошибке говорит ...

+0

Спасибо, что была опечатка. Есть шанс, что пользователь попытается найти даты с более длинным промежутком. В этом случае, как предотвратить эту ошибку? – dotnetrocks

+0

@Dotnetrocks: возможно, вам стоит проверить DATEDIFF, например. ДЕНЬ первым - если это меньше, чем ДЕНЬ в разнице, то вы можете проверить с SECONDS. Или просто поймайте исключение - если это произойдет, даты, очевидно, немного обособлены. –

2

Вы используете это в WHERE пункте против datetime колонка?

Если это так просто использовать

DECLARE @d DATETIME = '2010-12-04 22:14:49.000' 

SELECT .... 
WHERE YourCol >= @d AND YourCol < DATEADD(SECOND,1,@d) 

Это будет более эффективным sargable и в любом случае.

+0

есть способ удалить секунды с даты. Тогда я могу сделать одно на одном сравнении. – dotnetrocks

+1

Возможно. Если вы примените функцию к столбцу, чтобы удалить секунды, которые вы гарантируете, что индекс не может использоваться для удовлетворения этого запроса, и вы будете сканировать всю таблицу.Мой запрос в письменном виде может быть удовлетворен поиском диапазона. –

+0

@dotnetrocks Вы можете удалить миллисекунды из своего параметра с помощью SET @d = DATEADD (MS, -DATEPART (MS, @d), @d) –

0

Это удаляет секунды от даты

where convert (varchar(10), @date1, 108) + ' ' + CONVERT(varchar(5), @date1, 108) = convert (varchar(10), @date2, 108) + ' ' + CONVERT(varchar(5), @date2, 108) 
0

Cast каждого из значений даты и времени, как в примере ниже:

declare @stuff as datetime 
set @stuff = getdate() 
select @stuff 
SELECT CONVERT(VARCHAR(26), @stuff, 120) 

Выход =

2010-12-05 16:17:49.720 

и

2010-12-05 16:17:49 

Преобразование в тип 120 не включает миллисекунды.

Следуйте за этим LINK для других типов преобразований.

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