Предложение SQL Datepart Where не работает

#sql #sql-server #tsql #asp-classic #ado

#sql #sql-сервер #tsql #asp-классический #ado

Вопрос:

У меня проблема с завершением сложного запроса:

 SQLString = "SELECT i.CONCOM, 
                    COALESCE(SUM(CASE 
                                   WHEN C.CATEGORY_ID = '30' THEN 0 
                                   ELSE t.LOGMINS END), 0) AS TotalWithoutNew, 
                    COALESCE(SUM(t.LOGMINS), 0) AS TotalAllId 
               FROM Inquiry AS i 
         INNER JOIN TIMELOG AS t ON t.INQUIRY_ID = i.INQUIRY_ID 
         INNER JOIN PROD AS P ON i.PROD_ID = P.PROD_ID 
         INNER JOIN CATEGORY AS C ON P.CATEGORY_ID = C.CATEGORY_ID 
              WHERE (DATEPART(m, ESCDATE) = " amp; objmonth amp; ") 
                AND (DATEPART(y, ESCDATE) = " amp; objyear amp; ") 
           GROUP BY i.CONCOM 
           ORDER BY concom ASC"
  

Запрос отлично работает без предложения where, но когда я добавляю в него предложение where, оно ничего не возвращает. ESCDATE является полем DATETIME. Сначала я подумал, что в него передаются не целые числа, а строки, и это определенно целые числа.

Далее в скрипте ASP, который я использую Request.Querystring для получения месяца и года, и я в основном хочу проверить по дате ESC, что он возвращает результаты только за месяц, указанный в указанном году.

Комментарии:

1. Если есть индекс на ESCDATE , using DATEPART не сможет его использовать.

2. Вы должны использовать параметризованные запросы. Если вы берете эти значения прямо из Request.Querystring и объединяете их в запросе, у вас возникнут проблемы с внедрением SQL.

3. Чтобы подкрепить комментарий @ martin, проблема с sql-инъекцией является своего рода серьезной проблемой, и вы не должны ее игнорировать.

Ответ №1:

Спецификатор ‘y’ — это день года, а не year. Попробуйте вместо этого ‘yy’ или ‘гггг’.