Значит ситуация такая, есть у меня на работе замечательная программы 1С-архив. Использует она в качестве СУБД MSSQL. Собственно я это все хозяйство не сопровождаю, но есть на нашем внутреннем сайте отчеты по исполнению заданий, данные этих отчетов берутся из MSSQL.
Отчеты имеют параметрами:
Автора задания;
Исполнителя;
две даты;
Исполнение: Просрочено/Вовремя/Все;
Состояние: В работе/Выполнено/Все.
Все прекрасно работало!
Звонит значит мне админ 1С-архива, через много месяцев работы отчетов и просит зайти к нему.
А дело оказалось в том, что при обращении к хранимой процедуре с опр. параметрами выдавалось 3 записи в браузере (PHP, Apache, Solaris). А с теми же параметрами в программе MS SQL Server Management Studio (Windows XP)выдавалось четыре записи.
Реальный такой полтергейст.
Для чистоты эксперимента распечатал переменную SQL в браузере, в MS SQL Server Management Studio также 4 записи, а в браузере 3.
Ппц.
Посмотрели логи сервера, запросы попадающие серваку идентичны. Много было высказано в адрес Microsoft…
Решение
Причина была в том, что сравнение дат давало сбой. В SQL даты передавались строково и преобразовывались CONVERT(SMALLDATETIME, @FromDate) где @FromDate – строка
А нужно было
CONVERT(SMALLDATETIME, @FromDate, 104)
Применение данной функции было в нескольких местах, и только в одном месте допущена опечатка.
Зы. Процедуру писал не йааа 🙂