仅根据月份和年份选择mySQL

时间:2012-02-01 23:02:21

标签: php mysql

我的mySQL数据库中有一列有一些行。其中一行是DATE,如下所示:2012-02-01

我想要实现的是仅使用基于年份和月份的PHP进行SELECT。

SELECT的逻辑如下:

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

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

我该怎么做?

14 个答案:

答案 0 :(得分:183)

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

答案 1 :(得分:18)

如果你有

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

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

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

如果您有一个索引,那么此查询将使用Date上的索引:

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

也可以使用包容性独占区间,这种区间效果非常好(如果列为DATEDATETIMETIMESTAMP,您也不必担心,也不会考虑精度:

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

安全警告:

您应该正确地转义这些值或使用预准备语句。简而言之,使用PHP中推荐的任何方法,以避免任何SQL注入问题。

答案 2 :(得分: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
    );

修改
忘记了Unix时间戳转换。

答案 3 :(得分:5)

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

答案 4 :(得分:2)

你可以这样做:

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

答案 5 :(得分:2)

这里,查看MONTH和DATE在mySQL中的记录

以下是您的POST值$_POST['period']="2012-02";

只是,通过破折号$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的结果。

答案 6 :(得分:1)

逻辑将是:

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

LIKE运算符将选择以$_POST['period']开头的所有行,后跟短划线和mont的日期

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - 其他一些信息

答案 7 :(得分:1)

从日期列中获取月份和年份值

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

答案 8 :(得分:1)

假设您有一个数据库字段created_at,您可以在其中从时间戳记中获取价值。 您要从created_at日期按年和月进行搜索。

YEAR(date(created_at))=2019 AND MONTH(date(created_at))=2

答案 9 :(得分:0)

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

以下是代码:

avd

这列出了每个emp_nr以及它们累积的每月小时数之和。

答案 10 :(得分:0)

您可以通过将$ q更改为此:

$q="SELECT * FROM projects WHERE YEAR(date) = $year_v AND MONTH(date) = $month_v;

答案 11 :(得分:0)

似乎没有人在谈论性能,因此我在here上测试了两个最受欢迎的答案。该表具有结构的280万行

CREATE TABLE `salaries` (
  `emp_no` int(11) NOT NULL,
  `salary` int(11) NOT NULL,
  `from_date` date NOT NULL,
  `to_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `salaries`
  ADD PRIMARY KEY (`emp_no`,`from_date`);

这是执行的测试和结果

SELECT * FROM `salaries` WHERE YEAR(from_date) = 1992 AND MONTH(from_date) = 6
12339 results
-----------------
11.5 ms 
12.1 ms
09.5 ms
07.5 ms
10.2 ms
-----------------
10.2 ms Avg
-----------------


SELECT * FROM `salaries` WHERE from_date BETWEEN '1992-06-01' AND '1992-06-31'
-----------------
10.0 ms
10.8 ms
09.5 ms
09.0 ms
08.3 ms
-----------------
09.5 ms Avg
-----------------


SELECT * FROM `salaries` WHERE YEAR(to_date) = 1992 AND MONTH(to_date) = 6
10887 results
-----------------
10.2 ms
11.7 ms
11.8 ms
12.4 ms
09.6 ms
-----------------
11.1 ms Avg
-----------------


SELECT * FROM `salaries` WHERE to_date BETWEEN '1992-06-01' AND '1992-06-31'
-----------------
09.0 ms
07.5 ms
10.6 ms
11.7 ms
12.0 ms
-----------------
10.2 ms Avg
-----------------

我的结论

  1. BETWEEN在索引和未索引列上都稍好一些。
  2. 未索引的列比索引的列略慢。

答案 12 :(得分:0)

从表格中获取具体的月份和年份数据

from collections import Counter

string = "India"
c = Counter(string.lower())

"".join(x * (1 + (c[x.lower()] > 1)) for x in string)
'IIndiia'

答案 13 :(得分:-1)

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