SQL 多个 AND 语句
SQL multiple AND statements
问题是我想列出在所选月末(例如 2015 年 10 月 31 日)尚未支付的订单
这意味着:
列出从时间开始到31.10
的所有订单
AND date_payed 之间(1.11 - 今天)
AND 付款日期 = 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");
第一个 BETWEEN
不比较日期,而是比较字符串。所以 '02-2000' 会出现在 '03-2000' 之前,但会出现在 '02-2020' 之后,这可能不是你想要的。比较日期(比如第二个 BETWEEN
)来解决这个问题。
第二个 BETWEEN
看起来可以用更多的括号,但如果运算符优先级对您有利,您可能会放弃您的版本。
您的订购依据不必将日期转换为字符串。 ORDER BY date_added
就好了。
知道你想要什么,你得到什么,以及问题是什么会很有帮助。
您应该使用日期数据类型而不是字符串来进行所有日期算术和比较。如果必须使用字符串,则使用 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
这就是我的解决方案
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");
问题是我想列出在所选月末(例如 2015 年 10 月 31 日)尚未支付的订单
这意味着:
列出从时间开始到31.10
的所有订单
AND date_payed 之间(1.11 - 今天)
AND 付款日期 = 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");
第一个 BETWEEN
不比较日期,而是比较字符串。所以 '02-2000' 会出现在 '03-2000' 之前,但会出现在 '02-2020' 之后,这可能不是你想要的。比较日期(比如第二个 BETWEEN
)来解决这个问题。
第二个 BETWEEN
看起来可以用更多的括号,但如果运算符优先级对您有利,您可能会放弃您的版本。
您的订购依据不必将日期转换为字符串。 ORDER BY date_added
就好了。
知道你想要什么,你得到什么,以及问题是什么会很有帮助。
您应该使用日期数据类型而不是字符串来进行所有日期算术和比较。如果必须使用字符串,则使用 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
这就是我的解决方案
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");