Определение того, что делает этот оператор удаления - PullRequest
2 голосов
/ 25 января 2011

Не совсем программист sql.Мне кажется, что он ищет что-нибудь, где exch_date находится сегодня, и удаляет его.Это правильно?

DELETE FROM dbo.Table where 
DATEADD(dd, DATEDIFF(dd,0,exch_Date),0) = DATEADD(dd, DATEDIFF(dd,0,GETDATE()),0)

Ответы [ 4 ]

5 голосов
/ 25 января 2011

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

Select * from db.table
where DATEADD(dd, DATEDIFF(dd,0,exch_Date), 0)
    = DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)
3 голосов
/ 25 января 2011

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

1 голос
/ 25 января 2011

Если вы используете 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
1 голос
/ 25 января 2011

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

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 )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...