MySQL时间函数-运算篇

版权声明:zhiyu https://blog.csdn.net/ichglauben/article/details/82840971

1.DATE_FORMAT格式date_format用法

格式 描述
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时(00-23)
%h 小时(01-12)
%I 小时(01-12)
%i 分钟,数值(00-59)
%j 年的天(001-366)
%k 小时(0-23)
%l 小时(1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时(hh:mm:ss)
%U 周(00-53)星期日是一周的第一天
%u 周(00-53)星期一是一周的第一天
%V 周(01-53)星期日是一周的第一天,与 %X 使用
%v 周(01-53)星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天(0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位

2.cast函数用法:cast用法链接

CAST(value as type);
CONVERT(value, type);

就是CAST(xxx AS 类型), CONVERT(xxx,类型)。

转换的类型是有限制的。这个类型可以是以下值其中的一个:

二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
在这里插入图片描述
date_add使用方法地址

cookbook时间函数题目

– 计算年月日

SELECT last_update  - INTERVAL 5 day as up_minus_5D,
       last_update  + INTERVAL 5 day as up_plus_5D,
       last_update  - INTERVAL 5 month as up_minus_5M,
       last_update  + INTERVAL 5 month as up_plus_5M,
       last_update  - INTERVAL 5 year as up_minus_5Y,
       last_update  + INTERVAL 5 year as up_plus_5Y
 FROM `actor`  where `actor_id` = 65535;
-- 法二
SELECT date_add(last_update,INTERVAL -5 day) as up_minus_5D,
       date_add(last_update,INTERVAL 5 day) as up_plus_5D,
       date_add(last_update,INTERVAL -5 month) as up_minus_5M,
       date_add(last_update,INTERVAL 5 month) as up_plus_5M,
       date_add(last_update,INTERVAL -5 year) as up_minus_5Y,
       date_add(last_update,INTERVAL 5 year) as up_plus_5Y
FROM `actor` WHERE `actor_id` = 65530

– 1)计算两个日期之间的天数

SELECT `last_update` as 1_update from `actor` WHERE `actor_id` = 65535
SELECT `last_update` as 2_update from `actor` WHERE `actor_id` = 65530

select date_add(1_update, interval datediff(1_update, 2_update) day)
  FROM(
SELECT `last_update` as 1_update
  from `actor`
 WHERE `actor_id`= 65535) as X,
       (
SELECT `last_update` as 2_update
  from `actor`
 WHERE `actor_id`= 65530) AS Y

– 2)确定两个日期间的工作日数目
– 返回起始日期和结束日期之间的天数 计数除周末以外共有多少天

SELECT max(case when `actor_id`  = 33333 then `last_update` END ) FROM `actor` 
select max(case when `actor_id`  = 22222 then `last_update` END ) FROM `actor` 

– 出现NULL 情况 不加max

select (case when `actor_id`  = 33333 then `last_update` END),(case when `actor_id`  = 22222 then `last_update` END) FROM `actor` 
WHERE `actor_id` IN (22222,33333)

select max(case when `actor_id`  = 33333 then `last_update` END),max(case when `actor_id`  = 22222 then `last_update` END) FROM `actor` 
WHERE `actor_id` IN (22222,33333)

– 建基表

create TABLE t1000 (id_no int(20) AUTO_INCREMENT PRIMARY KEY )
INSERT INTO t1000 VALUES(1),(2),(3)
SELECT COUNT(*) FROM t1000

– 查找出 两个日期的差值并显示出来

select * from (select max(case when `actor_id`  = 33333 then `last_update` END) as 3_update,max(case when `actor_id`  = 22222 then `last_update` END) as 2_update FROM `actor` 
WHERE `actor_id` IN (22222,33333)) as X,t1000 WHERE t1000.id_no <=  datediff(2_update , 3_update) +1

– 将日期显示为 星期Mon Tue Wen … 并且 若显示为 interval

select  date_format(date_add(3_update, interval t1000.id_no-1 day), '%a') in ('Sat','Sun') 
  from(
select max(case when `actor_id`= 33333 then `last_update` END) as 3_update, max(case when `actor_id`= 22222 then `last_update` END) as 2_update
  FROM `actor`
 WHERE `actor_id` IN(22222, 33333)) as X,
       t1000
 WHERE t1000.id_no<= datediff(2_update, 3_update)+ 1

– 3)计算日期之间的工作日统计

select SUM(case when date_format(date_add(3_update, interval t1000.id_no-1 day), '%a') in ('Sat','Sun') then 0 else 1 END ) as days
  from(
select max(case when `actor_id`= 33333 then `last_update` END) as 3_update, max(case when `actor_id`= 22222 then `last_update` END) as 2_update
  FROM `actor`
 WHERE `actor_id` IN(22222, 33333)) as X,
       t1000
 WHERE t1000.id_no<= datediff(2_update, 3_update)+ 1


– 4)确定两个日期间的月份数&年数
– 1)测试日期

select min(last_update) as min_date,
       max(last_update) as max_date
   FROM `actor`

select mnth,mnth/12 from (
select (year(max_date) - year(min_date))*12 + (month(max_date)-month(min_date)) as mnth FROM (
select min(last_update) as min_date,max(last_update) as max_date FROM `actor`) as X) as Y

– 5)确定两个日期之间的秒 分 小时数 max() 将NULL 过滤掉 只有一行
– 1)

select max(case when actor_id = 33333 then `last_update` END ) as 2_update,
       max(case when `actor_id` = 22222 then `last_update` END ) as 3_update FROM `actor` 

– 2)

SELECT datediff(3_update,2_update)*24 hr,
       datediff(3_update,2_update)*24*60 min,
       datediff(3_update,2_update)*24*60*60 sec 
from (select max(case when actor_id = 33333 then `last_update` END ) as 2_update,
       max(case when `actor_id` = 22222 then `last_update` END ) as 3_update FROM `actor` ) as X

– 6)计算一年中周内各日期的次数
– 任务分解
– 1.生成一年内的所有日期
– 2.设置日期格式,得到每个日期对应为星期几
– 3.计数周内各日期分别有多少个

– 先生成每年的1.1号

select concat(year(CURRENT_DATE ),'-01-01') 
select concat(year(CURRENT_DATE )+1,'-01-01')

– 365天

SELECT datediff(cast(concat(year(CURRENT_DATE)+ 1, '-01-01')AS DATE), cast(concat(year(CURRENT_DATE), '-01-01')  AS DATE))

– 使用DATEADD函数再该日期上分别加上T500.ID中每个值,生成该年份的每一天
– 使用DATE_FORMAT
– cast()函数 日期转换

– 得到当前年份的每一天 以星期来显示

select date_format(date_add(cast(concat(year(CURRENT_DATE ),'-01-01')as date),INTERVAL t1000.id_no -1 day),'%W') as DAY
FROM t1000 where t1000.id_no <= datediff(cast(concat(year(CURRENT_DATE)+ 1, '-01-01')AS DATE), cast(concat(year(CURRENT_DATE), '-01-01')  AS DATE))

– 以星期来计数

select date_format(date_add(cast(concat(year(CURRENT_DATE), '-01-01') as date), INTERVAL t1000.id_no -1 day), '%W') as DAY,
       COUNT(*) as total_num
  FROM t1000
 where t1000.id_no<= datediff(cast(concat(year(CURRENT_DATE)+ 1, '-01-01') AS DATE), cast(concat(year(CURRENT_DATE), '-01-01') AS DATE))
 GROUP BY date_format(date_add(cast(concat(year(CURRENT_DATE), '-01-01') as date), INTERVAL t1000.id_no -1 day), '%W')

– 7) 确定当前记录和下一条记录之间相差的天数
– 解决:使用标量子查询 找到当前update的下一个update,使用datediff获得
– 相差天数

SELECT (SELECT min(d.last_update) FROM `film_actor` AS d) from `film_actor` as e WHERE e.`last_update` >

SELECT * FROM `category` 




SELECT x.*,datediff(x.last_update,x.next_update) diff
FROM (select e.category_id,e.name,
       e.last_update,
       (
SELECT MIN(d.last_update)
  FROM `category` as  d
 WHERE d.`last_update`> e.`last_update`) as  next_update
  FROM `category` as e 
) as  x

猜你喜欢

转载自blog.csdn.net/ichglauben/article/details/82840971