Никак не могу приучить себя выходить из подобных ситуаций, глубоко вздохнуть, посчитать до десяти, успокоиться, подумать, и найти первопричину.
Вот к примеру сегодня. Есть, некий, далеко не самый маленький SQL запрос. Для общего понимания сути, я его, естественно, упрощу
SELECT SUM(S.SomeValue) FROM SomeTable S WHERE S.Date > GETDATE()
Все, вроде бы, понятно. Запускаю запрос в отладчике, получаю значение суммы. Затем запускаю клиентское приложение – получаю другое значение суммы! Первая мысль, что в отладчике указал неправильные значения переменных. Проверяю – вроде, все нормально. Затем, проверяю, правильные ли параметры передаются в запрос – тоже все правильно. После этого, меня начинает колбасить, и я начинаю задалбывать коллег со словами: “А не мог бы ты посмотреть запрос?” (Вове, спасибо).
В, общем, время, которое можно было бы провести попивая кофе в беседке ушло на борьбу с ветряными мельницами:(
А логика примерно следующая:
1. Поле S.Date – не datetime, а varchar. Таблицу SomeTable создавал не я, но пора бы привыкнуть к подобным особенностям базы.
2. В отладчик и клиентское приложение мы ходим под разными пользователями. Я когда себе недавно создавал пользователя не доглядел, что в региональных настройках поставил для него British English, а не просто English. А это разные вещи.
3. В зависимости от региональных настроек текущего пользователя сервер автоматом по разному кастил строку к формату даты, или дату к формату строки(?). И каждый раз в выходной набор попадали различные значения.
Было потеряно уйму времени, только ради того, чтобы прийти к выводу, что в данном случае поле S.Date нужно конвертировать явно.
В общем, приятной всем отладки:)
2 комментария:
Отправить комментарий