0

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

"10/12/2009"

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

4

4 回答 4

3

检查 MySQL 函数STR_TO_DATE

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

于 2012-06-28T20:04:02.080 回答
0

对您的问题的简短回答是,您可以使用STR_TO_DATEandMONTH函数来 1)将字符串表示形式转换为 DATE,以及 2)从日期中提取月份部分:

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/%'

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

如果您要传递该月的参数,例如“6”,那么您可以构建您的语句,如下所示:

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

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

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

笔记:

前面的所有示例查询都将返回任何一年(2009 年、2010 年、2011 年)六月的行

您可以扩展这些示例,并对年份执行类似的操作,使用 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'
于 2012-06-28T20:30:19.507 回答
0

STR_TO_DATE 函数在这里是您的朋友:

SELECT * FROM my_table
WHERE STR_TO_DATE('10/12/2009','%M/%d/%Y') >= '2012-06-01';
于 2012-06-28T20:04:37.727 回答
0

如果我们想要当前月份或特定月份的数据,MONTH应该在这里有所帮助。例如:

$month = date('m'); OR particular month.
SELECT * FROM users WHERE MONTH(str_to_date("10/12/2009",'%e/%m/%Y')) = $month;
于 2017-09-20T09:38:14.403 回答