mysql 日期函数相关 及一个小sql写法

来源:互联网 发布:linux 解压到根目录 编辑:程序博客网 时间:2024/05/16 17:48

日光荏苒,我也负责mysql数据库的事情了。其实一点都不想做。

1. mysql的日期比较。

比如要查看或比较某个时间点 或者时间区间的数据,就要用到时间的比较。 一般mysql里字段的类型是 datetime。

datetime ,如果直接写<='2016-01-27 00:00:00' 进行比较 会造成少数据的问题。所以建议用unix_timestamp.

unix_timestamp(create_time) > unix_timestamp('2016-01-25 23:59:59') and unix_timestamp(create_time) < unix_timestamp('2016-01-26 23:59:59'); 


2.select a,b,count(b) from test where create_time >=CURDATE() group by a,b;

test 表里的 a,b 两列。  a代表用户, b代表事件,就是 用户a进行了事件b的次数。事件b ,分为 b1,b2,b3,。。

这个时候出来的结果是,仅仅显示事件不为0的条目。。

客户需要的是,即使事件bn 没有做过,也显示   a  bn  0.


想到的是 都是建立temp表, test_temp


方法一, 用left jion,但表test_temp 有2列,(用户An,事件Bn)  要把用户A 对应所有的事件刷一遍。 a,b1; a,b2;......

然后查询语句为:

select  a.task_org,a.task_status,count(b.task_status)
from test_temp  a
left join test b on a.task_status =b.task_status and a.task_org=b.task_org
and  b.create_time >=CURDATE()
group by a.task_org,a.task_status;



方法二:  只用1列 建立test_temp;

select task_org,task_status,sum(num) from (
select b.task_org,a.task_status,(case when a.task_status=b.task_status then num else 0 end) as num
from (select distinct task_status from test_temp )  a,
(select task_status,task_org,count(task_status) as num fromtest where unix_timestamp(create_time) > unix_timestamp('2016-01-27 00:00:00') and unix_timestamp(create_time) < unix_timestamp('2016-01-27 10:00:00') group by task_status,task_org) b) mn
group by task_org,task_status
;



PS:  更改一个表 某一列的COMMENT 语法:
alter table `A` modify column `logn` varchar(6) default null COMMENT '任务状态';

0 0
原创粉丝点击