在mysql中检索相同日期的行

时间:2013-12-30 08:54:52

标签: mysql sql

我想要两个日期之间的所有行。我在之间尝试了<​​strong>,但它没有显示相同日期的值,即2013-01-01到2013-01-01。在这种情况下,结果为null。但是如果我给2013-01-01到2013-01-02这样的日期。它显示了2013-01-01整天的10行。任何想法的人如何在MySQL中解决这个问题。我的查询是这样的

SELECT MONTHNAME(access_date) as date,
       DATE_FORMAT( access_date,'%d/%m/%Y') as month_date ,
       COUNT( log_id ) as total_count
FROM user_activity_log 
WHERE dam_id =
         (SELECT dam_id FROM dam_content_details
                 WHERE content_type= 'userLogin') AND
                 access_date >= '2013-01-03' AND
                 access_date <= '2013-01-03'
                GROUP BY MONTH( access_date ) 
                ORDER BY access_date ASC 

4 个答案:

答案 0 :(得分:7)

这就像你的测试一样:

mysql> select  '2013-12-30 12:11:23' BETWEEN '2013-12-30' AND '2013-12-30' as test;
+------+
| test |
+------+
|    0 |
+------+

这是使用日期时间值的正确方法:

mysql> select  '2013-12-30 12:11:23' BETWEEN '2013-12-30 00:00:00' AND '2013-12-30 23:59:59' as test;
+------+
| test |
+------+
|    1 |
+------+

这是在日期和日期时间值之间工作的解决方法:

mysql> select  CAST('2013-12-30 12:11:23' AS DATE) BETWEEN '2013-12-30' AND '2013-12-30' as test;
+------+
| test |
+------+
|    1 |
+------+

来自MySQL doc

  

MySQL将时间值转换为日期或日期和时间值   将时间的字符串值解析为日期或日期和时间。这个   不太可能有用。例如,'23:12:31'被解释为a   日期变为'2032-12-31'。时间值无效,因为日期变为   '0000-00-00'或NULL。

     

显式转换可用于覆盖隐式转换。对于   例如,在DATE和DATETIME值的比较中,DATE值为   通过添加'00:00:00'的时间部分强制转换为DATETIME类型。至   通过忽略DATETIME值的时间部分来执行比较   相反,请按以下方式使用CAST()函数:

     

date_col = CAST(datetime_col AS DATE)

我认为可能是一个错误...

答案 1 :(得分:1)

SELECT * FROM your_table WHERE date BETWEEN '2012-02-28' AND '2012-03-30'

答案 2 :(得分:0)

使用between,例如:

SELECT * FROM some_table_name WHERE date_column BETWEEN '2009-05-28' AND '2012-12-14'

我的情况是:

SELECT MONTHNAME(access_date) as date,DATE_FORMAT( access_date,  '%d/%m/%Y'
) as month_date ,COUNT( log_id ) as total_count FROM user_activity_log WHERE dam_id =
(SELECT dam_id FROM dam_content_details WHERE content_type= 'userLogin') AND access_date BETWEEN '2013-01-03' AND '2013-01-03' GROUP BY MONTH( access_date ) ORDER BY 
access_date ASC 

来自the documentation

  
      
  • expr BETWEEN minmax
  •   
     

如果expr大于或等于minexpr小于或等于max,则BETWEEN返回1,否则返回0. 如果所有参数的类型相同,则相当于表达式(min&lt; = expr AND expr&lt; = max)。否则类型转换根据第11.2节“表达式评估中的类型转换”中描述的规则进行,但适用于所有三个参数。

所以它真的只是语法糖。

答案 3 :(得分:-2)

尝试像这样改变

SELECT * 
FROM your_table 
WHERE date BETWEEN '2013-01-01 00:00:00' AND '2013-01-01 23:59:59'