2012-02-01 188 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和他們已經積累了月度小時的總和。