2012-06-28 83 views
0

我在我的表日期格式字符串:检索基于特定月份在MySQL中的所有记录

"10/12/2009" 

现在,人们怎么会从一个月拿到的所有记录,可以说月(数字“6 “正在提供)?

+1

真的,最好的解决方案是更改列以存储适当的MySQL日期时间而不是此格式。 –

+0

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substr – biziclop

+0

也就是说,MONTH(STR_TO_DATE(yourdate,'%M /%d /%Y'))= 6' –

回答

0

简短的回答你的问题是,你可以使用STR_TO_DATEMONTH功能:1)字符串表示形式转换为日期,和2)提取物从日期的月份部分:

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

(这是假设在这里,通过'10/12/2009' 的,要指定10月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函数在当月的功能,或用于字符串比较

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和月功能,我们可以指定一个比较原生DATE柱。这种方法允许我们在日期列上使用索引,这可以提高大型表上的查询性能。

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

谢谢,这是最好的答案!这是我正在寻找的:$查询=“选择*从$表在哪里MONTH(STR_TO_DATE(日期,'%d /%m /%Y'))= $ month“; –

3

检查MySQL函数STR_TO_DATE

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

+2

+1表示日期不应以此格式存储。 – davidethell

+0

我同意他们不应该我的数据库虽然:( –

0

的STR_TO_DATE功能是你的朋友在这里:

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

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

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