PHP SQL在4列之间进行选择

PHP SQL在4列之间进行选择,sql,Sql,我正在寻找一个解决方案,我可以选择两个日期之间的条目。我的桌子是这样的 ID | YEAR | MONTH | .... SELECT d.* from dates as d where STR_TO_DATE( concat('1,',d.month,',',d.year) ,'%d,%m,%Y') > STR_TO_DATE('1,5,2015','%d,%m,%Y') and STR_TO_DATE( concat('1,',d.month

我正在寻找一个解决方案,我可以选择两个日期之间的条目。我的桌子是这样的

ID | YEAR | MONTH | ....
SELECT 
    d.* 
from 
    dates as d 
where 
    STR_TO_DATE( concat('1,',d.month,',',d.year) ,'%d,%m,%Y') > STR_TO_DATE('1,5,2015','%d,%m,%Y')
and
    STR_TO_DATE( concat('1,',d.month,',',d.year) ,'%d,%m,%Y') < STR_TO_DATE('1,4,2016','%d,%m,%Y')
现在,我想选择之间的所有条目

MONTH 9 | YEAR 2015
MONTH 1 | YEAR 2016
我没有收到任何条目,因为第二个月比第一个月低。我的问题是:

SELECT * 
FROM table 
WHERE YEAR >= '$year' 
AND MONTH >= '$month' 
AND YEAR <= '$year2' 
AND MONTH <= '$month2'
选择*
从桌子上
其中年份>=“$YEAR”
和月份>=“$MONTH”

年份年份与月份之间没有断开连接,因此不能单独测试它们

试试像这样的东西

$date1 = $year*100+$month;   // will be 201509
$date2 = $year2*100+$month2; // will be 201602
...
SELECT * FROM table WHERE (YEAR*100)+MONTH >= '$date1' AND (YEAR*100)+MONTH <= '$date2'
$date1=$year*100+$month;//将是201509
$date2=$year2*100+$month2;//将是201602
...

从表中选择*,其中(年份*100)+月份>='$date1'和(年份*100)+月份年份不会与月份断开连接,因此无法单独测试它们

试试像这样的东西

$date1 = $year*100+$month;   // will be 201509
$date2 = $year2*100+$month2; // will be 201602
...
SELECT * FROM table WHERE (YEAR*100)+MONTH >= '$date1' AND (YEAR*100)+MONTH <= '$date2'
$date1=$year*100+$month;//将是201509
$date2=$year2*100+$month2;//将是201602
...

选择*FROM table,其中(YEAR*100)+MONTH>='$date1'和(YEAR*100)+MONTH虽然有很多方法可以解决这个问题,但最好的方法是在mysql查询中使用
str_to_date
将这些值转换为适当的日期类型。这是PHP的
strotime
等价物,您的新查询应该是这样的

ID | YEAR | MONTH | ....
SELECT 
    d.* 
from 
    dates as d 
where 
    STR_TO_DATE( concat('1,',d.month,',',d.year) ,'%d,%m,%Y') > STR_TO_DATE('1,5,2015','%d,%m,%Y')
and
    STR_TO_DATE( concat('1,',d.month,',',d.year) ,'%d,%m,%Y') < STR_TO_DATE('1,4,2016','%d,%m,%Y')
选择
d、 *
从…起
日期为d
哪里
截止日期(concat('1',d.month','d.year','d.year),'%d,%m,%Y')>截止日期('1,52015','%d,%m,%Y'))
和
截止日期(具体日期('1',d.month','d.year','d.year),'%d,%m,%Y')
使用这种技术,您可以轻松地比较日期,做更多的事情,而不必担心日历的其他复杂性


来源:

虽然有很多方法可以解决这个问题,但是最好的方法是在mysql查询中使用
str_to_date
将这些值转换成合适的日期类型,这是PHP的
strotime
等价物,您的新查询应该是这样的

ID | YEAR | MONTH | ....
SELECT 
    d.* 
from 
    dates as d 
where 
    STR_TO_DATE( concat('1,',d.month,',',d.year) ,'%d,%m,%Y') > STR_TO_DATE('1,5,2015','%d,%m,%Y')
and
    STR_TO_DATE( concat('1,',d.month,',',d.year) ,'%d,%m,%Y') < STR_TO_DATE('1,4,2016','%d,%m,%Y')
选择
d、 *
从…起
日期为d
哪里
截止日期(concat('1',d.month','d.year','d.year),'%d,%m,%Y')>截止日期('1,52015','%d,%m,%Y'))
和
截止日期(具体日期('1',d.month','d.year','d.year),'%d,%m,%Y')
使用这种技术,您可以轻松地比较日期,做更多的事情,而不必担心日历的其他复杂性

来源:

选择
*
从…起
`我的桌子`
哪里
((`YEAR`*12)+`MONTH`>=($YEAR*12)+$MONTH)
和(`YEAR`*12)+`MONTH`)
SELECT
*
从…起
`我的桌子`
哪里
((`YEAR`*12)+`MONTH`>=($YEAR*12)+$MONTH)

(`YEAR`*12)+`MONTH`)您需要填充月份,以确保它以零开始。否则,例如20162将低于201512

$date1 = $year . str_pad($month, 2, "0", STR_PAD_LEFT);
$date2 = $year2 . str_pad($month2, 2, "0", STR_PAD_LEFT);

"SELECT * FROM dates WHERE concat(`year`, LPAD(`month`, 2, '0')) >= '$date1' AND concat(`year`, LPAD(`month`, 2, '0')) <= '$date2'"
$date1=$year。str_pad($month,2,“0”,str_pad_LEFT);
$date2=$year2。str_pad($month2,2,“0”,stru pad_左);

“从concat(`year`,LPAD(`month`,2,'0'))>=`date1'和concat(`year`,LPAD(`month`,2,'0'))的日期中选择*您需要填充月份以确保它以零开始。否则,例如,20162将低于201512

$date1 = $year . str_pad($month, 2, "0", STR_PAD_LEFT);
$date2 = $year2 . str_pad($month2, 2, "0", STR_PAD_LEFT);

"SELECT * FROM dates WHERE concat(`year`, LPAD(`month`, 2, '0')) >= '$date1' AND concat(`year`, LPAD(`month`, 2, '0')) <= '$date2'"
$date1=$year.str\u pad($month,2,“0”,str\u pad\u LEFT);
$date2=$year2.stru pad($month2,2,“0”,stru pad_左);

“从concat(`year`,LPAD(`month`,2,'0'))>='$date1'和concat(`year`,LPAD(`month`,2,'0'))的日期中选择*有几个很好的答案,但假设您不/不能更改日期的格式,您可以做的事情是

WHERE ((YEAR>'$year') OR
       (YEAR=='$year' AND MONTH>='$month')
AND ((YEAR<'$year2') OR
       (YEAR=='$year2' AND MONTH<='$month2')
其中((年>“$YEAR”)或
(年=='$YEAR'和月>='$MONTH')

(年有几个好的答案,但是假设你不改变日期的格式,你可以做的是

WHERE ((YEAR>'$year') OR
       (YEAR=='$year' AND MONTH>='$month')
AND ((YEAR<'$year2') OR
       (YEAR=='$year2' AND MONTH<='$month2')
其中((年>“$YEAR”)或
(年=='$YEAR'和月>='$MONTH')

和((也许你会找到答案,她:斯维德曼:不,他的结构不同。也许你会找到答案,她:斯维德曼:不,他的结构不同。嗨,如果你对你的代码添加一个解释,这对其他人很有用。我是新来的。谢谢你的提示!)您好-如果您添加代码解释,这对其他人很有用。我是新来的。谢谢您的提示!:)您假设month变量在php变量和数据库中都是零填充的,否则如果date1为201510,date2为20162@MagnusEriksson他使用算术而不是串联来创建PHP变量。
201600+2
将是
201602
,而不是
20162
。我要添加一些因为在MySQL中这些是保留函数名,所以在年和月之间打勾。您可能也不应该为列命名月份和年份。您假设php变量和数据库中的月份变量都是零填充的。否则,如果date1是201510,date2是0,它将显示错误的值20162@MagnusEriksson他是肌酐g PHP变量使用算术,而不是串联。
201600+2
将是
201602
,而不是
20162
。我会在年份和月份周围添加一些勾号,因为这些是MySQL中保留的函数名。您可能也不应该为列命名月份和年份。