MySQL時間函式
格式 | 描述 |
---|---|
%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 位 |
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