简体   繁体   English

从数据库中按月和年选择日期

[英]Selecting date by month and year from database

I'm making a calendar with events in Codeigniter, so I want do build a list of this events sorted by month and year. 我正在使用Codeigniter中的事件制作日历,因此我想建立按月和年排序的事件列表。

In database, I have the list of events and I want to retrieve then by the field date, that uses the DATE datatype. 在数据库中,我有事件列表,我想按字段日期检索,该日期使用DATE数据类型。

    if($year != null and $month != null)
    {
        $this->db->where('date', '?');
    }
    $events = $this->db->get('agenda')->result();

Basically i have a yyyy-mm to compare with a yyyy-mm-dd. 基本上我有一个yyyy-mm与yyyy-mm-dd进行比较。

Thank you and sorry for my English. 谢谢你,抱歉我的英语。

Assuming that $this->db->where() makes a AND field = value try this. 假设$this->db->where()使AND field = value尝试此操作。

$this->db->where("DATE_FORMAT(date,'%d')", $month);
$this->db->where("DATE_FORMAT(date,'%Y')", $year );

The DATE_FORMAT() function is a MYSQL function for manipulating/formating dates so this should equate to DATE_FORMAT()函数是用于处理日期/设置日期格式的MYSQL函数,因此应等同于

WHERE
     DATE_FORMAT(date,'%d') = '12'
 AND DATE_FORMAT(date,'%Y') = '2014'

Or you could use 或者你可以使用

$this->db->where('MONTH(date)', $month);
$this->db->where('YEAR(date)', $year );

In mysql your query should be like this 在MySQL中,您的查询应该是这样的

SELECT * FROM table_name WHERE data_field_name >='2000-10-1'  //Y-m-d

SELECT * FROM table_name WHERE data_field_name >='2000-10-1' AND data_field_name <='2014-10-1'

SELECT * FROM table_name WHERE data_field_name >='2000-10-1'

SELECT * FROM table_name WHERE data_field_name BETWEEN '2000-10-1' AND '2014-10-1'

You can do this also 您也可以这样做

SELECT * FROM table_name WHERE YEAR( data_field_name ) >= '2010' AND MONTH( data_field_name ) >='10' AND DAY( data_field_name ) >= '1'

etc.... 等等....

for you use case I would do something like this 对于您的用例,我会做这样的事情

SELECT
    *, MONTH( date_field) as month
FROM
    table_name
WHERE
    something = '1'
ORDER BY 
    month

The best way to do this is as follows: 最好的方法如下:

$monthstring = sprintf('%d-%d-01', $year, $month); /* make yyyy-mm-01 string */
$this->db->where ( "date >= '$monthstring'");
$this->db->where ( "date < '$monthstring' + INTERVAL 1 MONTH");

This is a good way to do this because it allows an index to be used to search the date column if one happens to be available. 这是一个很好的方法,因为如果有一个索引可用,它允许使用索引来搜索date列。

It expands to this sort of MySQL where clause 它扩展为这种MySQL where子句

 WHERE date >= '2014-07-01' AND date < '2014-07-01' + INTERVAL 1 MONTH

That's exactly what you need for an index range scan. 这正是您进行索引范围扫描所需要的。

That query should solve your problem! 该查询应该可以解决您的问题!

SELECT * FROM table_name WHERE data_field_name >='01/10/2000'

or 要么

SELECT * FROM table_name WHERE data_field_name between '01/01/2009' and '01/01/2010'; //FOR YEAR

or 要么

SELECT * FROM table_name WHERE data_field_name between '01/01/2009' and '01/02/2009'; //FOR MONTH

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM