запрос mysql со сравнением дат

#mysql #sql #date #select

#mysql #sql #Дата #выберите

Вопрос:

Я использовал следующий запрос для получения информации, превышающей 2012 год, но я не получаю правильные данные при сравнении с датой, пожалуйста, дайте мне правильный запрос? ЗАПРОС MYSQL:

 SELECT a.invoiceno,
       a.invoicerefno,
       a.invoicedate,
       c.companyname,
       a.grandtotal,
       a.twempname,
       itemdescription,
       quantity
FROM twsql_twalldata.t_invoicedet a
INNER JOIN twsql_twalldata.t_salesinv_items b ON a.invoiceno=b.invoiceno
INNER JOIN twsql_twalldata.t_customerdet c ON a.customercode=c.customercode
WHERE a.twempname NOT LIKE '%Auto%'
  AND itemdescription LIKE '%AMC%'
  OR itemdescription LIKE '%annual maintenance contract%'
  AND invoicecancelled=0
  AND a.invoicedate > '2012-04-01 00:00:00';
  

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

1. Какой тип invoicedate в таблице?

Ответ №1:

Попробуйте это:

 SELECT a.invoiceno,
       a.invoicerefno,
       a.invoicedate,
       c.companyname,
       a.grandtotal,
       a.twempname,
       itemdescription,
       quantity
FROM twsql_twalldata.t_invoicedet a
INNER JOIN twsql_twalldata.t_salesinv_items b ON a.invoiceno=b.invoiceno
INNER JOIN twsql_twalldata.t_customerdet c ON a.customercode=c.customercode
WHERE a.twempname NOT LIKE '%Auto%' AND 
      (itemdescription LIKE '%AMC%' OR itemdescription LIKE '%annual maintenance contract%') AND 
       invoicecancelled=0 AND DATE(a.invoicedate) > DATE('2012-04-01');
  

Ответ №2:

Если invoicedate тип данных — datetime, то вам потребуется одно исправление, то есть использование правильных круглых скобок для условия ИЛИ.

 WHERE 
a.twempname NOT LIKE '%Auto%'
AND ( itemdescription LIKE '%AMC%' OR itemdescription LIKE '%annual maintenance contract%')
AND invoicecancelled=0
AND a.invoicedate > '2012-04-01 00:00:00';
  

Ответ №3:

изменить:

  AND a.invoicedate > '2012-04-01 00:00:00';
  

Для:

  AND a.invoicedate >  STR_TO_DATE('2012-04-01 00:00:00','%Y-%m-%d' %h:%i:%s')
  

Ответ №4:

Первая проблема заключается в том, что у вас нет обязательных круглых скобок, т. Е. ваше условие ИЛИ должно быть помещено внутри скобок.

 SELECT a.invoiceno,
       a.invoicerefno,
       a.invoicedate,
       c.companyname,
       a.grandtotal,
       a.twempname,
       itemdescription,
       quantity
FROM twsql_twalldata.t_invoicedet a
INNER JOIN twsql_twalldata.t_salesinv_items b ON a.invoiceno=b.invoiceno
INNER JOIN twsql_twalldata.t_customerdet c ON a.customercode=c.customercode
WHERE a.twempname NOT LIKE '%Auto%'
  AND (itemdescription LIKE '%AMC%' OR itemdescription LIKE '%annual maintenance contract%')
  AND invoicecancelled=0
  AND a.invoicedate > '2012-04-01';
  

Вторая проблема может заключаться в том, что ваш invoicedate не имеет типа date или datetime тогда вам нужно сначала преобразовать его в date , а затем сравнить

 AND STR_TO_DATE(a.invoicedate, '%Y-%m-%d') > '2012-04-01';
  

Если это второй случай, я бы посоветовал вам указать это поле date или datetime.