2012-02-01 204 views
60

我的mySQL DB中有一列有一些行。其中一行是DATE,如下所示:2012-02-01选择仅基于月份和年份的mySQL

我想实现的目标是在仅基于年份和月份的PHP上执行SELECT操作。

SELECT的逻辑将是如下:

$q="SELECT * FROM projects WHERE Date="SELECT HERE THE SPECIFIC YEAR AND MONTH""; 

的具体年份和月份将从$_POST变量传递,这样$_POST['period']="2012-02";

我该怎么办呢?

+2

您可以使用BETWEEN语句 – 2012-02-01 23:04:47

回答

140
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5 
+2

Smooth,之前没有看到过! – 2012-02-01 23:07:39

+4

您的查询不会扩展,因为它需要执行全表扫描,除非在MySQL中有一些我不知道的优化。 – aefxx 2012-02-01 23:20:59

+1

这对'EXTRACT(YEAR_MONTH FROM Date)“是否正确? – cmbuckley 2012-02-01 23:59:23

1

的逻辑是:

SELECT * FROM objects WHERE Date LIKE '$_POST[period]-%'; 

LIKE运营商将选择与$_POST['period']开始,然后仪表板和的蒙

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html当天所有行 - 一些额外的信息

+3

-1字符串操作数据内部表示为一个整数!?你是认真的? – aefxx 2012-02-01 23:17:19

+0

@aefxx你会感到惊讶,但那会工作:) – Yaroslav 2013-11-18 00:20:19

+0

@Yaroslav是的,高效率,我想:D – aefxx 2013-11-20 09:39:20

2
$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1; 
2

你可以做喜欢这样的:

$q="SELECT * FROM projects WHERE Year(Date) = '$year' and Month(Date) = '$month'"; 
+1

注射嘉豪! – frostymarvelous 2016-01-10 17:48:56

+1

这也不使用索引 – 2016-09-29 12:37:13

0

从日期列

select year(Date) as "year", month(Date) as "month" from Projects 
8

在这里,你去拿月份和年份值。将计算留给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时间戳转换。

+0

它是索引友好的,但strtotime给你int,你需要先将它转换为mysql的日期。 – piotrm 2012-02-01 23:26:33

+0

@piotrm你说得对,我忘记了转换部分。 – aefxx 2012-02-01 23:27:21

+0

它应该是字符串连接,而不是求和操作:'$ end = strtotime($ date。'1 month - 1 second');' – 2015-07-09 21:58:17

17

如果你有

$_POST['period'] = "2012-02"; 

首先,找到该月的第一天:

$q = " 
    SELECT * 
    FROM projects 
    WHERE Date BETWEEN '$first_day' 
        AND LAST_DAY('$first_day') 
    " ; 

$first_day = $_POST['period'] . "-01" 

然后,如果你有一个这样的查询使用索引上Date

人们也可以使用包容排他的时间间隔,工作很好(你不必担心如果列是DATEDATETIMETIMESTAMP,也无法左右的精度:

$q = " 
    SELECT * 
    FROM projects 
    WHERE Date >= '$first_day' 
     AND Date < '$first_day' + INTERVAL 1 MONTH 
    " ; 

安全警告:

你应该合理逃避这些值或使用准备好的语句。简而言之,现在在PHP中推荐使用任何方法,以避免任何SQL注入问题。

+0

between ...和语句运行良好。 – hahakubile 2013-10-28 02:21:54

+2

是的,+1之间,我最初是使用Year + Month函数,但是这样没有缩放,也没有使用索引。 – sobelito 2015-03-05 00:39:19

+0

@sobelito是的。我通常更喜欢包容性排他间隔。发布更新。 – 2015-03-05 11:00:30

3

在这里,在MySQL的

这里的月份和日期查找记录是你的岗位价值$_POST['period']="2012-02";

只是,由破折号$Period = explode('-',$_POST['period']);

爆炸值获取从爆炸数值数组:

Array ( [0] => 2012 [1] => 02 )

将值存入SQL查询:

SELECT * FROM projects WHERE YEAR(Date) = '".$Period[0]."' AND Month(Date) = '".$Period[0]."';

获得MONTH和YEAR的结果。

-1

是的这是工作,但它只返回一行,而有几行只能使用选定的列进行检索。 与SELECT标题一样,Date from mytable WHERE YEAR(Date)= 2017 AND MONTH(Date)= 09 只返回一行。

0

这是我使用的查询,它将在一段时间内返回每条记录作为总和。

下面是代码:

$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和他们已经积累了月度小时的总和。