1. 程式人生 > >MySQL時間函式

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