MySQL常用函数之日期时间函数

  • Post author:
  • Post category:mysql




1. 获取当前日期和时间


select now();


2. 获取当期日期,不包括时间


select current_date(),curdate();


3. 获取当前时间,不包括日期


select current_time(),curtime();


4. 获取当前时间戳


select unix_timestamp();


5. 获取指定日期的时间戳


select unix_timestamp(‘20170221’);


6. 获取指定日期的年份,月份,第几周,天数


select year(now()),month(now()),weekofyear(now()),dayofyear(now());

每个函数中的参数now()表示当前日期。


7. 提取指定日期中的小时


select hour(now());


8. 日期格式化


select date_format(‘2017-02-21 11:12:01’, ‘%Y%m%d%H%i%s’);


9. 将时间戳格式化为日期


select from_unixtime(1487646810,’%Y-%m-%d %H:%i:%s’);


10. 日期拼凑


select makedate(2017,52);

makedate函数的第一个参数表示年份,第二个参数表示一年中的第几天。


11. 时间拼凑


select maketime(11,20,30);

maketime函数的第一个参数表示小时,第二个参数表示分钟,第三个参数表示秒数。


12. 日期加减


select date_add(now(), interval 1 year);

date_add函数的第一个参数表示要加减的日期,第二个参数是一个表达式,表达式中的interval是一个固定关键词,后面需带上具体的日期间隔,包含单位。

sql语句中的单位year可以替换为下面的任何一个选项:

year:年份

quarter:季度

month:月份

week:周数

day:天数

hour:小时

minute:分钟

second:秒数

microsecond:微秒


注意:日期间隔中的数字可以为负数,表示做减法操作。



13. 计算两个日期的差值


select datediff(now(), ‘20161120’);

datediff函数只能计算两个日期(date)之间相差的天数,如果想指定差值类型,请使用timestampdiff函数。


14. 计算两个日期的差值(指定差值类型)


select timestampdiff(month, ‘20161120’, now());

timestampdiff函数的第一个参数表示差值类型,后面两个参数表示要进行计算的日期,计算规则是:拿最后一个参数表示的日期,减去前面一个参数表示的日期。

sql语句中的单位year可以替换为下面的任何一个选项:

year:年份

quarter:季度

month:月份

week:周数

day:天数

hour:小时

minute:分钟

second:秒数

microsecond:微秒


15. 返回某个日期的该月最后一天的日期


select last_day(‘20170221’);


16. 获取当年第一天、最后一天


select date_sub(curdate(),interval dayofyear(now())-1 day) as first_day,

concat(year(now()),’-12-31′) as last_day;


17. 获取当前周的第一天


这个取决于对第一天的定义,如果设定周日为第一天,请用下面的语句:

select date_sub(curdate(),interval weekday(curdate())+1 day);

如果设定周一为第一天,请用下面的语句:

select date_sub(curdate(),interval weekday(curdate()) day);

计算公式:

此处假定周一为每一周的第一天。


select date_sub(curdate(),interval weekday(curdate()) + N*7 day);


其中,变量N表示前几周,为0时表示当前周。


18. 获取当前周的最后一天


这个取决于对最后一天的定义,如果设定周六为最后一天,请用下面的语句:

select date_sub(curdate(),interval weekday(curdate()) – 5 day);

如果设定周日为最后一天,请用下面的语句:

select date_sub(curdate(),interval weekday(curdate()) – 6 day);

计算公式:

此处假定周日为每一周的最后一天。


select date_sub(curdate(),interval weekday(curdate()) + N*7 – 6 day);


其中,变量N表示前几周,为0时表示当前周。


19. 获取当前月的第一天


select concat(date_format(last_day(now()),’%Y-%m-‘),’01’);

计算公式:


select concat(date_format(last_day(now() – interval N month),’%Y-%m-‘),’01’);


其中,变量N表示前面第几个月,为0时表示当前月。


20. 获取当前月的最后一天


select last_day(now());

计算公式:


select last_day(now() – interval N month);


其中,变量N表示前面第几个月,为0时表示当前月。


21. 获取当前季度的第一天


select concat(date_format(last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-3 month),’%Y-%m-‘),’01’);

计算公式:


select concat(date_format(last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-3*(N+1) month),’%Y-%m-‘),’01’);


其中,变量N表示前面第几个季度,为0时表示当前季度。


22. 获取当前季度的最后一天


select last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-1 month);

计算公式:


select last_day(makedate(extract(year from curdate()),1) + interval quarter(curdate())*3-1-N*3 month);


其中,变量N表示前面第几个季度,为0时表示当前季度。


23.获取两个日期之间的时间序列

创建一张临时表,根据需求,插入一定数量的数据。

CREATE TABLE `temp_table` (

`num` int(11) unsigned DEFAULT 1

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `temp_table`(`num`) values

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),

(1),(1),(1),(1),(1),(1),(1),(1),(1),(1);

select date_format(date_add(‘20180701′,interval @i:=@i+1 day),’%Y-%m-%d’) as date

from (select rownum from (select @num:=@num+1 as rownum,r.* from temp_table r,(select @num:=0) t) tmp where rownum <= (select datediff(‘20180731’, ‘20180701’)+1)) as p,

(select @i:=-1) as tmp;



计算


公式:



select date_format(date_add(开始日期,interval @i:=@i+1 day),’%Y-%m-%d’) as date

from (select rownum from (select @num:=@num+1 as rownum,r.* from temp_table r,(select @num:=0) t) tmp where rownum <= (select datediff(截止日期, 开始日期)+1)) as p,

(select @i:=-1) as tmp;








版权声明:本文为tdcqfyl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。