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