2015-10-13 3 views
0

Проблемы в том, что я хочу перечислить заказы, которые были haven't оплачены в конце выбранного месяца (например, октябрь 31.10.2015)SQL множественного И заявление

Это означает:
список всех заказов от начала времен до 31.10
и date_payed МЕЖДУ (1,11 - сегодня) и дата оплаченный = NULL или до 1970

$ sel_date = 10-2015 (выбранный день)
$ s3 = 11-2015// в этом случае

from 
    octt_order 
    WHERE order_status_id >= 1 
    AND (date_format(date_added,'%m-%Y') BETWEEN '11-2010' AND '$sel_date') 
    AND (date_payed BETWEEN STR_TO_DATE('$s3','%m-%Y') AND STR_TO_DATE('11-2300','%m-%Y') OR date_payed is NULL) 

    ORDER BY date_format(date_added,'%Y/%m/%d') ASC"); 
+0

Что происходит, когда вы запускаете код размещен? –

ответ

0

Это было решение для меня

octt_order 
    WHERE order_status_id >= 1 


    AND (date_added BETWEEN STR_TO_DATE('01-2001','%m-%Y') AND STR_TO_DATE('$s3','%m-%Y')) 
    AND (date_payed BETWEEN STR_TO_DATE('$s3','%m-%Y') AND STR_TO_DATE('11-2300','%m-%Y') OR date_payed is NULL)  

    ORDER BY date_format(date_added,'%Y/%m/%d') ASC"); 
0

Первый BETWEEN не сравнивает даты, а строки. Итак, '02 -2000 'поступит до '02 -2000', но после '02 -2020 ', что, вероятно, не то, что вы хотите. Сравните даты (например, во втором BETWEEN), чтобы исправить это.

Второй BETWEEN выглядит так, как будто он может работать с некоторыми скобками, хотя вы можете уйти с вашей версией, если приоритет оператора работает в вашу пользу.

Ваш заказ не должен преобразовывать дату в строку. ORDER BY date_added будет в порядке.

Это поможет узнать, чего вы хотите, что вы получаете, и в чем проблема.

+0

Проблема в том, что я хочу перечислить заказы, которые не были оплачены в конце выбранного месяца (например, 31 октября 2015 года) То есть: список всех заказов с начала времени до 31.10 И date_payed 1.11 - today AND date paided = NULL или до 1970 – Christoffer

+0

Я думаю, вы просто хотите что-то (схематично) следующим образом: 'select * from table where date_added> '20151001' и date_added <'20151101' и (date_payed> '20151101' или date_payed равно null). Нет необходимости во всех этих конвертациях формата «МЕЖДУ» или «странно». –

0

Вы должны выполнить все арифметические даты и сравнения, используя тип данных даты, а не строки. Если вам нужно использовать строки, используйте стандартные форматы ISO: YYYY-MM-DD или YYYYMMDD.

Таким образом, вы должны переключить сравнения с использованием дат и использования логики как это:

FROM octt_order 
WHERE order_status_id >= 1 AND 
     date_added >= '2010-11-01' AND 
     date_added < STR_TO_DATE(CONCAT('$seldate', '-01'), '%m-%Y-%d') + interval 1 month AND 
     date_payed >= STR_TO_DATE(CONCAT('$s3', '-01'), '%m-%Y-%d') + interval 1 month AND 
     (date_payed < '2300-12-01' or date_payed is null) 
ORDER BY date_added asc 
+0

Это приводит к тому, что записи не найдены. Я редактировал мой пост здесь. Пожалуйста, проверь это – Christoffer

Смежные вопросы