我表中的日期是以下格式的字符串:
"10/12/2009"
现在如何获得一个月的所有记录,比如说六月(提供数字“6”)?
检查 MySQL 函数STR_TO_DATE。
但是,您不应该将日期存储为字符串。使用日期类型。
对您的问题的简短回答是,您可以使用STR_TO_DATE
andMONTH
函数来 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'
STR_TO_DATE 函数在这里是您的朋友:
SELECT * FROM my_table
WHERE STR_TO_DATE('10/12/2009','%M/%d/%Y') >= '2012-06-01';
如果我们想要当前月份或特定月份的数据,MONTH应该在这里有所帮助。例如:
$month = date('m'); OR particular month.
SELECT * FROM users WHERE MONTH(str_to_date("10/12/2009",'%e/%m/%Y')) = $month;