根据MySQL中的特定月份检索所有记录

时间:2012-06-28 20:00:47

标签: mysql

我表格中的日期是字符串格式:

"10/12/2009"

现在如何从一个月获得所有记录,比如6月(提供数字“6”)?

4 个答案:

答案 0 :(得分:3)

检查MySQL函数STR_TO_DATE

但是,您不应将日期存储为字符串。使用DATE类型。

答案 1 :(得分:0)

STR_TO_DATE函数是您的朋友:

SELECT * FROM my_table
WHERE STR_TO_DATE('10/12/2009','%M/%d/%Y') >= '2012-06-01';

答案 2 :(得分:0)

您问题的简短回答是,您可以使用STR_TO_DATEMONTH函数1)将字符串表示转换为DATE,2)从日期中提取月份组件: / p>

SELECT t.*
  FROM mytable t
 WHERE MONTH(STR_TO_DATE(t.dateasstringcol,'%M/%d/%Y')) = 6

(这是假设在'10 / 12/2009',你指定的是10月12日,而不是12月10日。如果不是这样,你需要调整格式字符串。)

或者,如果月份确实是日期的主要部分,那么如果月份是主要成分,则可以进行简单的字符串比较:

SELECT t.*
  FROM mytable t
 WHERE t.dateasstringcol LIKE '6/%' 
    OR t.dateasstringcol LIKE '06/%'

(如果您为表示日期的striing值指定了确切的格式,则可以消除其中一个谓词:如果month总是存储为两位数 - 或者 - 月份永远不会存储前导零。)

如果您要传递月份的参数,例如'6',那么你可以构建你的语句:

 WHERE t.dateasstringcol LIKE '6' + '/%'

如果month是该日期的第二个组成部分,那么您可以使用:

SELECT t.*
  FROM mytable t
 WHERE t.dateasstringcol LIKE '%/' + '6' + '/%' 
    OR t.dateasstringcol LIKE '%/' + '06' + /%'

注意:

以前的所有示例查询都会返回任何年份(2009年,2010年,2011年)6月的行

您可以使用YEAR函数代替MONTH函数,或者进行字符串比较,扩展这些示例,并使用年份执行类似的操作

    AND t.dateasstringcol LIKE '%/%/2011'

通常情况下,我们会使用日期范围提取特定年份的特定月份的行,例如:

SELECT t.*
  FROM mytable t
 WHERE MONTH(STR_TO_DATE(t.dateasstring,'%M/%d/%Y')) >= '2011-06-01'
   AND MONTH(STR_TO_DATE(t.dateasstring,'%M/%d/%Y')) <  '2011-07-01'

当然,当日期值存储为DATE数据类型而不是VARCHAR时,这意味着我们不需要STR_TO_DATE和MONTH函数,我们可以指定与本机DATE列的比较。这种方法允许我们在日期列上使用索引,这可以提高大型表的查询性能。

SELECT t.*
  FROM mytable t
 WHERE t.realdatecol >= '2011-06-01'
   AND t.realdatecol <  '2011-07-01'

答案 3 :(得分:0)

如果我们想要当前月份或特定月份数据,

MONTH应该会有所帮助。 e.g:

$month = date('m'); OR particular month.
SELECT * FROM users WHERE MONTH(str_to_date("10/12/2009",'%e/%m/%Y')) = $month;