2011-01-25 3 views

ответ

5

Один из способов проверить это - ввести его в оператор select. Это поможет вам определить все строки, которые будут затронуты.

Select * from db.table 
where DATEADD(dd, DATEDIFF(dd,0,exch_Date), 0) 
    = DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0) 
+0

Вау, это отлично. Я обязательно буду использовать это в будущем! – Spooks

3

Похоже, что существует целый день (как в момент времени) сравнение между exch_Date и текущей датой.

+0

Спасибо, я хотел бы дать два ответа – Spooks

1

Это то, что он делает. Вот еще один способ, который обрабатывает даты как номера, вместо того чтобы работать с функциями манипулирования датой:

DELETE FROM dbo.Table WHERE 
CAST(CAST(exch_Date as float) as int) = CAST(CAST(getdate() as float) as int) 

Примечание: Я первоначально имел это:

DELETE FROM dbo.Table WHERE 
CAST(exch_Date as int) = CAST(getdate() as int) 

Но Андрей отметил в комментариях, это округляется до следующего полудня, а не просто усекает дату до целого числа. Пройдя сначала через float-преобразование, целочисленное поведение ведет себя так, как ожидалось. Решение Андрея о вычитании 0,5 также отлично работает, хотя я предпочитаю немного более длинную версию с плавающей запятой, которая позволяет избежать любой потенциальной путаницы магического числа по дороге.

+0

Сэр, я твердо верю, что вы ошибаетесь здесь. 'CAST (datetimevalue AS int)' будет округлять числовое число с плавающей запятой 'datetimevalue' до ближайшего целого. Вы должны сделать это следующим образом: 'CAST (datetimevalue - 0.5 AS int)', чтобы получить целочисленный эквивалент datepart. –

+0

Андрей, ты прав; Я забыл об этом следующем раунде. Вы также можете обойти его, перейдя через 'float', что приводит к отмене времени в ожидаемом режиме. Я соответствующим образом изменяю ответ и благодарю за исправление. –

1

Если вы используете SQL Server 2008, лучшим решением на сегодняшний день является CAST на сегодняшний день, которая до сих пор SARGable (можно использовать индекс)

DELETE db.table 
where CAST(exch_Date as Date) = DATEDIFF(dd,0,GETDATE()) 

DateAdd to 0 часть избыточна (посторонний) код.

Перед SQL Server 2008 вам лучше по соображениям производительности всегда проверять столбец даты и времени на диапазон, чем использовать функцию, приводящую к сканированию таблицы.

DELETE db.table 
where exch_Date >= DATEDIFF(dd,0,GETDATE()) 
    and exch_Date < DATEDIFF(dd,0,GETDATE()) +1 
Смежные вопросы