相信很多人都跟我一樣,當我們使用不同數據庫的時候,都會有這樣一個疑問:我們當前使用的這個數據庫到底有沒有爲我們提供某個我們需要的功能的函數? 說到點子上了吧?因此,我們特別關心數據庫的函數。當然,每一種數據庫提供的函數都比較多,都難以通過記憶記下多少,也沒有那個必要去花很多的時間去浪費精力去記下那麼多的函數。我們所要做的就是,在我們需要某個函數的時候,有一個地方,能讓我們很快地就查詢、找到我們需要的函數。就像現在購物一樣,很多東西都不需要我們出門去實地考察,去看,很多東西的大致情況,我們通過網絡就能瞭解到。當然,有那個時間實地去更好,可惜通常事與願違。好了,閒話不多說,我特選取了我們在數據庫方面用的最多的日期時間函數進行整理。這篇是MySQL的日期時間函數整理,順便提一下,接着,會有一篇Oracle日期時間函數的整理。需要查詢的可以去看看。
首先,在這裏我聲明一下,這篇文章中的很大部分都是我參考了網上很多人提供的資料,傷害到了切莫見怪。
好呢,廢話不多說,上菜。
首先,迎面向這邊走來的是,具有相同功能都能獲取當前日期或者時間的幾位佳麗,她們分別是:now()、sysdate()、current_timestamp()、localtime()、localtimestamp()、utc_timestamp()出來的都是日期+時間,curdate()、current_date()、utc_date()出來的都是日期,curtime()、current_time()、utc_time()出來的都是時間。
第一批:
- select now();
- select sysdate();
- select current_timestamp();
- select localtime();
- select localtimestamp();
- select utc_timestamp(); //只有她最特殊,與東方佳麗不同,她可是每次都要猶抱琵琶
- 遮面地多化八個小時的妝,出來的效果都會比別人晚八個小時。
- 怎麼?千呼萬喚始出來以後,是不是你心動了呢?
她們都倔強地一致運行出結果,日期+時間,不知道你看上了她們中的哪一位?
- 2013-01-21 20:17:28
第二批:
- select curdate();
- select current_date();
- select utc_date(); //特殊,不贅述。
她們都倔強地一致運行出結果,日期,不知道你看上了她們中的哪一位?
- 2013-01-21
第三批:
- select curtime();
- select current_time();
- select utc_time(); //特殊,不贅述。
她們都倔強地一致運行出結果,時間,不知道你看上了她們中的哪一位?
- 20:17:28
好了,別傻眼了,前面的都只是拋磚引玉,重頭人物的亮相纔剛開始。繼續上菜。
接下來,這次向我們走來的是,年、月、日、時、分、秒等,國色天香就不說了,主要是她們很重要。她們就直接在下面“亮相”誘惑你們得了。代碼和運行結果如下,合併:
- SELECT YEAR('1998-02-03'); //獲取哪一年。
- SELECT MONTH('1998-02-03'); //獲哪一取月。
- SELECT DAY('1998-02-03'); //獲取哪一天。
- SELECT HOUR('1998-02-03 20:11:27'); //獲取時。
- SELECT MINUTE('1998-02-03 20:11:27'); //獲取分。
- SELECT SECOND('1998-02-03 20:11:27'); //獲取秒。
- 運行結果:1998 2 3 20 11 27
- SELECT DAYOFYEAR('1998-02-03'); //一年中的哪一天。
- SELECT DAYOFMONTH('1998-02-03'); //一個月中的哪一天。
- SELECT DAYOFWEEK('1998-02-03'); //一週的哪一天。
- 運行結果:34 3 3
- SELECT MONTHNAME("1998-02-05"); //獲取月的英文名稱。
- SELECT DAYNAME("1998-02-05"); //獲取日的英文名稱。
- 運行結果:February Thursday
- SELECT WEEK('1998-02-03');
- SELECT WEEKOFYEAR('1998-02-03');
- SELECT WEEKDAY('1998-02-03');
- 運行結果:5 6 1
- SELECT QUARTER('1998-02-03');
- 運行結果:1
- SELECT PERIOD_ADD(9801,2);
- 運行結果:199803
- SELECT PERIOD_DIFF(9802,199703);
- 運行結果:11
好了,回過神,另一批重要的人物上場了,她們都有個愛好,喜歡“間隔”時間:
- SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
- 運行結果:1998-01-01 00:00:00
- SELECT "1998-01-01" - INTERVAL 1 SECOND;
- 運行結果:1997-12-31 23:59:59
- SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 SECOND);
- 運行結果:1998-01-01 00:00:00
- SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
- 運行結果:1997-12-02
- SELECT ADDDATE("1997-12-31 23:59:59",INTERVAL 1 SECOND);
- 運行結果:1998-01-01 00:00:00
- SELECT SUBDATE("1998-01-02", INTERVAL 31 DAY);
- 運行結果:1997-12-02
接近尾聲,日期格式化終於壓軸上場,她們妖嬈,以各種媚姿出現:
- SELECT DATE_FORMAT('1997-10-04 22:23:00','%W %M %Y');
- 格式化日期,讓日期的顯示更漂亮。
- %M 月名(January……December)
- %W 星期名(Sunday……Saturday)
- %D 有英語前綴的月份的日期(1st, 2nd, 3rd等)。
- %Y 年, 數字, 4 位 %y 年, 數字, 2 位
- %a 縮寫的星期名(Sun……Sat)
- %d 月份中的天數, 數字(00……31)
- %e 月份中的天數, 數字(0……31)
- %m 月, 數字(01……12)
- %c 月, 數字(1……12)
- %b 縮寫的月份名(Jan……Dec)
- %j 一年中的天數(001……366)
- %H 小時(00……23)
- %k 小時(0……23)
- %h 小時(01……12)
- %I 小時(01……12)
- %l 小時(1……12)
- %i 分鐘, 數字(00……59)
- %r 時間,12 小時(hh:mm:ss [AP]M)
- %T 時間,24 小時(hh:mm:ss)
- %S 秒(00……59)
- %s 秒(00……59)
- %p AM或PM
- %w 一個星期中的天數(0=Sunday ……6=Saturday)
- %U 星期(0……52), 這裏星期天是星期的第一天
- %u 星期(0……52), 這裏星期一是星期的第一天
- %% 字符%
- 運行結果:Saturday October 1997
最後上場的是日期、時間轉換函數,還有獲取指定日期的上一天以及拼湊日期和時間:
- SELECT SEC_TO_TIME(2378); //秒轉換爲時間。
- 運行結果:00:39:38
- SELECT TIME_TO_SEC('22:23:00'); //時間轉換爲秒。
- 運行結果:80580
- SELECT TO_DAYS('1997-10-07'); //天轉換爲秒。
- 運行結果:729669
- SELECT FROM_DAYS(729669); //秒轉換爲天。
- 運行結果:1997-10-07
- SELECT LAST_DAY('2008-02-01'); //返回指定日期的上一天。
- 運行結果:2008-02-29
- SELECT MAKEDATE(2001,31); //拼湊日期。
- 運行結果:2001-01-31
- SELECT MAKETIME(12,15,30); //拼湊時間。
- 運行結果:12:15:30
好了,走着。