Я строю динамический запрос как хранимую процедуру в SQL Server 2008 и получаю некоторые неожиданные результаты, когда сравниваю дату (предоставляется в качестве параметра) и дату и время (хранятся в базе данных).Я искал несколько способов сравнить два, не принимая во внимание временную часть, и нашел это:
DATEDIFF(day, @d, v.ScheduledDate) = 0
Что я делаю с этим, пытаюсь найти записи, где указан предоставленный параметр даты и сохраненыScheduledDate одинаковы (в днях, например, 05.05.2011 и 02/05/2011 11: 26: 19.157).Это запрос, который я написал для этого:
SET @sql = 'SELECT e.Id, e.FirstName, e.LastName, v.ScheduledDate
FROM Employee e, Visit v
WHERE 1=1'
-- Several IF IS NOT NULL statements here
IF @d IS NOT NULL
BEGIN
SET @sql = @sql + ' AND DATEDIFF(day, ''' + @d + ''',' + 'v.ScheduledDate) = 0
AND v.EmpId = e.Id '
END
EXEC (@sql)
Я ожидаю, что этот запрос приведет ко всем запланированным датам для любого сотрудника, у которого запланировано посещение на этот день.Другими словами, если у меня есть два сотрудника с идентификаторами 5 и 7 и в таблице посещений есть две записи ScheduleDate от 02.05.2011 для сотрудников с идентификаторами 5 и 7, я ожидаю, что оба этих сотрудника вернутся, когда язапустите этот запрос.Кажется, однако, что когда я запускаю его, я получаю только один ряд назад.(Как примечание, две записи ScheduledDate, с которыми я работаю, находятся в один и тот же день, но на расстоянии около 3 часов друг от друга. Я думаю, что функция DATEDIFF будет учитывать это, поскольку несколько часов, безусловно, находятся в пределахвременной интервал дня.) Если я изменю = в запросе на> = 0 или <= 0, я получу больше строк, как и ожидалось, но, как ни странно, все еще получаю только одну запись для этой конкретной даты.В таблице есть другие записи, в которых один и тот же сотрудник имеет несколько посещений в разные даты, и они возвращаются соответственно, когда я использую> = 0 или <= 0. Например, сотрудник с идентификатором 41 имеет 3 посещения 10-29-2011, 11-24-2011, 12-28-2011 и все 3 из них возвращаются, когда я изменяю DATEDIFF на> = 0. Я все еще не понимаю, почему я получаю только одну запись, когда два разных сотрудниканазначить визит на тот же день.Кто-нибудь может дать некоторое представление о том, где моя логика идет не так?Обратите внимание, что когда я тестирую это, я только предоставляю параметр ScheduledDate.Все остальные операторы IF NOT NOT NULL просто пропускаются, поскольку все остальные параметры вставляются как NULL.