2016-08-03 244 views
0

我含有S MySQL查询,我想从我的数据库中提取数据,但它的基础上当月信息MySQL查询为当前日期

FROM lbs_trace_etrack WHERE (lbs_agent = '$slfirstname' AND DATE (lbs_date) = CURDATE()) ORDER BY lbs_date DESC LIMIT 0,50"); 

此字符串翻出当天的信息。

我也曾尝试下面的字符串,但从中得不到任何结果:

FROM lbs_trace_etrack WHERE (lbs_agent = '$slfirstname' AND MONTH(lbs_date) = (MONTH(NOW()) AND YEAR(lbs_date) = YEAR(NOW()) 

我的表的日期格式是遵循2016年8月2日

+0

是'lbs_date'实际上是一个日期,日期时间或时间戳字段? –

+0

@ Mike Brant是的,它的格式是2016-08-02,如 –

+0

不确定这是字符串格式还是实际的日期格式字段,因为在日期字段上调用DATE()没有意义。 –

回答

-1

你可以尝试提取一个月,这样的作为EXTRACT(MONTH from NOW())

+0

如果您想要获取当前月份的结果而不是每年的[当前月份值]的结果,则无法在不带'年份()'的情况下使用MONTH()''。 –

+0

什么?我没有使用MONTH()YEAR()。我写了与其他答案相同的结果MONTH(CURDATE()) – anthomaxcool

+0

我的意思是说你只考虑MONTH。您的条款将简单评估为“8”。如果在WHERE子句比较中使用此值,则将返回2016年8月,2015年8月,2014年8月等的值,因为MONTH值会匹配所有这些值。如果您想要特定年份的特定月份,则必须将月份值与年份值一起使用。 –

-1

你可以用下面的代码,如果时间戳 MONTH(CURDATE())

+0

如果你想得到当前月份的结果,而不是每年的[[当前月份值]]的结果,你就不能有意义地使用'MONTH()'而不用'YEAR()'。 –

+0

谢谢@Mike Brant, –

0

假设lbs_agent是在注释中提到的日期字段类型,你可以这样做(请注意,我只是显示你的WHERE子句中的相关日期部分):

WHERE lbs_agent >= DATE_FORMAT(NOW() ,'%Y-%m-01') 

它,你不使用左侧的函数调用是非常重要的(字段定义)一侧的WHERE比较,因为您将无法利用该字段上的任何索引。要做到这一点,需要使用MySQL进行全表扫描,并对表中的每一行执行该字段的功能,以便进行比较。

随意使用MySQL函数作为比较值,因为那些在计划查询时只计算一次。然后,您可以在该字段上使用索引,以快速筛选符合条件的表中的行。从查询执行的角度来看,这基本上是一样的,如果你的查询有此WHERE子句:

WHERE lbs_agent >= '2016-08-01' 

这是比这将作为执行你的问题的例子:

WHERE DATE(lbs_date) = '2016-08-03' 

WHERE MONTH(lbs_date) = 8 AND YEAR(lbs_date) = 2016 

这两种需要全表扫描,因为从现场得到的值不能确定,直到行被扫描。

0

或者使用PHP变量像这样:

<?php 
$start = date('Y-m-01'); // FIRST DAY OF CURRENT MONTH 
$end = date("Y-m-t", strtotime(date("Y-m-d"))); // LAST DAY OF CURRENT MONTH 
$sql = "SELECT * FROM lbs_trace_etrack WHERE lbs_agent = '".$slfirstname."' AND (lbs_date BETWEEN '".$start."' AND '".$end."')"; 
?> 
+0

一个有效的解决方案,但OP可能需要考虑日期是权威性的。例如,如果数据库表中的日期值是使用MySQL服务器的权威日期设置的,并且这可能与PHP应用程序服务器的日期(即不同的时区设置)有所不同,那么这可能会在月份边界附近引入错误。底线是OP应该与日期权威的地方一致。 –

0

我做了以下和它的作品

FROM lbs_trace_etrack WHERE lbs_agent = '$slfirstname' AND MONTH(lbs_date) = MONTH(CURDATE()) AND YEAR(lbs_date) = YEAR(CURDATE()) ORDER BY lbs_date ASC, lbs_time ASC 

感谢所有和提乔指导

+0

这可能“工作”,但它需要执行全表扫描,所以它不是一个非常理想的答案。 –