我的mySQL数据库中有一列有一些行 . 其中一行是DATE,如下所示: 2012-02-01
2012-02-01
我想要实现的是仅使用基于年份和月份的PHP进行SELECT .
SELECT的逻辑如下:
$q="SELECT * FROM projects WHERE Date="SELECT HERE THE SPECIFIC YEAR AND MONTH"";
具体的月份和年份将从 $_POST 变量传递,如 $_POST['period']="2012-02";
$_POST
$_POST['period']="2012-02";
我该怎么做?
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5
如果你有
$_POST['period'] = "2012-02";
首先,找到每月的第一天:
$first_day = $_POST['period'] . "-01"
然后这个查询将使用 Date 上的索引,如果你有一个:
Date
$q = " SELECT * FROM projects WHERE Date BETWEEN '$first_day' AND LAST_DAY( '$first_day' ) " ;
也可以使用包容性排他间隔,这种间隔效果非常好(如果列是 DATE , DATETIME 或 TIMESTAMP ,也不必担心精度:
DATE
DATETIME
TIMESTAMP
$q = " SELECT * FROM projects WHERE Date >= '$first_day' AND Date < '$first_day' + INTERVAL 1 MONTH " ;
Security warning:
您应该正确地转义这些值或使用预准备语句 . 简而言之,使用PHP中推荐的任何方法,以避免任何SQL注入问题 .
干得好 . 将计算保留给PHP并保存数据库一些工作 . 这样,您可以有效地使用 Date 列上的索引 .
<?php $date = $_POST['period']; $start = strtotime($date); $end = strtotime($date . ' 1 month - 1 second'); $query = sprintf( 'SELECT * FROM projects WHERE Date BETWEEN FROM_UNIXTIME(%u) AND FROM_UNIXTIME(%u)', $start, $end );
EDIT忘记了Unix时间戳转换 .
$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1;
在这里,通过MONTH和DATE在mySQL中查找记录
这是你的POST值 $_POST['period']="2012-02";
只是,用破折号爆炸 Value $Period = explode('-',$_POST['period']);
$Period = explode('-',$_POST['period']);
从爆炸值中获取数组:
Array ( [0] => 2012 [1] => 02 )
在SQL Query中输入值:
SELECT * FROM projects WHERE YEAR(Date) = '".$Period[0]."' AND Month(Date) = '".$Period[0]."';
获得MONTH和YEAR的结果 .
你可以这样做:
$q="SELECT * FROM projects WHERE Year(Date) = '$year' and Month(Date) = '$month'";
逻辑将是:
SELECT * FROM objects WHERE Date LIKE '$_POST[period]-%';
LIKE 运算符将选择以 $_POST['period'] 开头的所有行,后跟破折号和mont的日期
LIKE
$_POST['period']
http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - 一些其他信息
从日期列中获取月份和年份值
select year(Date) as "year", month(Date) as "month" from Projects
这是我使用的查询,它将在一个句点内返回每个记录作为总和 .
这是代码:
$result = mysqli_query($conn,"SELECT emp_nr, SUM(az) FROM az_konto WHERE date BETWEEN '2018-01-01 00:00:00' AND '2018-01-31 23:59:59' GROUP BY emp_nr ASC"); echo "<table border='1'> <tr> <th>Mitarbeiter NR</th> <th>Stunden im Monat</th> </tr>"; while($row = mysqli_fetch_array($result)) { $emp_nr=$row['emp_nr']; $az=$row['SUM(az)']; echo "<tr>"; echo "<td>" . $emp_nr . "</td>"; echo "<td>" . $az . "</td>"; echo "</tr>"; } echo "</table>"; $conn->close(); ?>
这列出了每个emp_nr以及它们累积的每月小时数之和 .
是的,这是有效的,但它只返回一行,而有几行只能使用选定的列进行检索 . 与SELECT Title一样,Date FROM mytable WHERE YEAR(Date)= 2017 AND MONTH(Date)= 09仅返回一行 .
10 回答
如果你有
首先,找到每月的第一天:
然后这个查询将使用
Date
上的索引,如果你有一个:也可以使用包容性排他间隔,这种间隔效果非常好(如果列是
DATE
,DATETIME
或TIMESTAMP
,也不必担心精度:Security warning:
您应该正确地转义这些值或使用预准备语句 . 简而言之,使用PHP中推荐的任何方法,以避免任何SQL注入问题 .
干得好 . 将计算保留给PHP并保存数据库一些工作 . 这样,您可以有效地使用
Date
列上的索引 .EDIT
忘记了Unix时间戳转换 .
在这里,通过MONTH和DATE在mySQL中查找记录
这是你的POST值
$_POST['period']="2012-02";
只是,用破折号爆炸 Value
$Period = explode('-',$_POST['period']);
从爆炸值中获取数组:
Array ( [0] => 2012 [1] => 02 )
在SQL Query中输入值:
SELECT * FROM projects WHERE YEAR(Date) = '".$Period[0]."' AND Month(Date) = '".$Period[0]."';
获得MONTH和YEAR的结果 .
你可以这样做:
逻辑将是:
LIKE
运算符将选择以$_POST['period']
开头的所有行,后跟破折号和mont的日期http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - 一些其他信息
从日期列中获取月份和年份值
这是我使用的查询,它将在一个句点内返回每个记录作为总和 .
这是代码:
这列出了每个emp_nr以及它们累积的每月小时数之和 .
是的,这是有效的,但它只返回一行,而有几行只能使用选定的列进行检索 . 与SELECT Title一样,Date FROM mytable WHERE YEAR(Date)= 2017 AND MONTH(Date)= 09仅返回一行 .