mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...
MySQL學(xué)習(xí)專欄 正在持續(xù)更新中:)
文章目錄
日期和時間函數(shù) NOW STR_TO_DATE DATE_FORMAT
流程控制函數(shù) IF IFNULL CASE
下章預(yù)告
日期和時間函數(shù) NOW STR_TO_DATE DATE_FORMAT
函數(shù)很多 不過都有規(guī)律可記,也不難
名稱
英文
中文
返回值
NOW(x)
now
現(xiàn)在(時間)
時間日期一起
CURDATE()
current date
當(dāng)前日期
當(dāng)前具體日期
CURTIME()
current time
當(dāng)前時間
當(dāng)前具體時間
還有一些具體從一串日期中具體提取的函數(shù),函數(shù)名都是簡單的英語:
YEAR(date)
MONTH(date)
DAY(date)
HOUR(time)
MINUTE(time)
SECOND(time)
形式上,date 是2020-1-5 time是23:34:22,注意是形式。下面是實驗結(jié)果。
在上面六個函數(shù)后面加個NAME,就可以獲得名字。
很明顯,如果給的參數(shù)缺了(HOUR需要時間 卻只給了日期),也不會返回NULL,應(yīng)該是未給參數(shù)都默認補全為0了。
STR_TO_DATE: str to date 字符串轉(zhuǎn)日期(格式),他需要提供解析格式,再輸出正常日期的格式,我們看下面例子:
SELECT STR_TO_DATE('1-5-2019','%m-%d-%y'); 這個類似正則匹配,
SELECT STR_TO_DATE('1, 5, 2019','%m, %d, %y');
DATE_FORMAT date-format 將日期格式化成你想要的樣子。
下面是格式符號的列表,不常用的都刪掉了:
名稱
用法
舉例
%Y
四位數(shù)的年
2020
%y
兩位數(shù)的年
20 (2020)
%m
月
01~12
%M
月
英語形式 eg.January
%d
日
01~31
-
-
-
%H
24小時制小時
00~24
%h
12小時制小時
00~12
%i
分鐘
00~59
%S
一分鐘鐘的第幾秒
00~59
流程控制函數(shù) IF IFNULL CASE
IF 函數(shù)和IFNULL 類似三目運算符,達到條件 返回啥,不達到條件又返回啥。注意IF()可以看做一個表達式。
SELECT
`last_name`,
IF(
`commission_pct`,
'有獎金',
'沒獎金'
) AS 獎金結(jié)果
FROM
employees ;
對IF而言 所謂條件就是 是否為真
對IFNULL而言 條件就是 是否為NULL。
案例 老員工回饋問題 在employees中,獲得所有人的基本工資,入職時間,獎金率,資歷。認為入職時間在04年以前的,資歷是老員工,記為1,04以后為新員工,記為0。另外,不允許表格中出現(xiàn)NULL,排序按獎金率降序排列。
SELECT
`salary` 基本工資,
IFNULL(`commission_pct`, 0) 獎金率,
IFNULL(`hiredate`, 0) 入職時間,
IF(YEAR(`hiredate`)<2004, 1, 0) 資歷
FROM employees
ORDER BY 獎金率 DESC;
IFNULL就是為了避免NULL的出現(xiàn)導(dǎo)致計算錯誤,而IF用于判斷年份資歷。
CASE
》第一種方式
CASE可以作為一個表達式語句,就和IF() IFNULL()一樣的,作為SELECT的組成部分打印出來。嘗試下面的案例, 也就是上面案例改造了一下:
USE data1;
SELECT
`salary` 基本工資,
IFNULL(`commission_pct`, 0) 獎金率,
IFNULL(`hiredate`, 0) 入職時間,
IF(YEAR(`hiredate`)<2004, 1, 0) 資歷,
CASE IFNULL(`commission_pct`, 0)
WHEN 0.40 THEN salary*(1+0.6)
WHEN 0.35 THEN salary*(1+0.4)
WHEN 0.30 THEN salary*(1+0.2)
ELSE salary*(1+0.0)
END AS 第二種工資算法結(jié)果
FROM employees
ORDER BY 獎金率 DESC;
藍框起來就作為一個語句使用,你可以給個別名“第二種工資算法結(jié)果”
結(jié)果大概這個樣子:
那問題來了,如果我希望是一個區(qū)間判斷呢?比如,入職時間在2000~2004年的員工獎金加成為0.6,明顯上面的方式只能判斷時間=2000 也即是一個定值。
》第二種方式
案例 老員工回饋問題:比起之前以2004年,一刀切認為老員工還是新員工,這里我們細分一下(類似采樣頻率提高 量化精度提升),在96年以前老員工回饋加成為0.6,97~02年回饋加成為0.4, etc
根據(jù)公式:salary*(1+commission_pct+回饋加成) = 最終工資
計算所有人的最終工資,降序排列輸出。
欄目:名字 入職時間 獎金率 最終工資
最終效果如圖:
USE data1;
SELECT
CONCAT(`last_name`,'-',`first_name`) 名字,
`salary` 基本工資,
IFNULL(`commission_pct`, 0) 獎金率,
IFNULL(`hiredate`, 0) 入職時間,
CASE
WHEN YEAR(`hiredate`) < 1996
THEN `salary` * (1+0.6+IFNULL(`commission_pct`, 0))
WHEN YEAR(`hiredate`) BETWEEN 1997 AND 2000
THEN `salary` * (1+0.4+IFNULL(`commission_pct`, 0))
WHEN YEAR(`hiredate`) BETWEEN 2001 AND 2010
THEN `salary` * (1+0.2+IFNULL(`commission_pct`, 0))
WHEN YEAR(`hiredate`) BETWEEN 2011 AND 2014
THEN `salary` * (1+0.1+IFNULL(`commission_pct`, 0))
ELSE `salary` * (1+0.0+IFNULL(`commission_pct`, 0))
END AS 最終工資
FROM
employees
ORDER BY 最終工資 DESC ;
下章預(yù)告
目前我們學(xué)習(xí)了幾種所謂單行函數(shù):
數(shù)學(xué)函數(shù)
字符串處理函數(shù)
時間日期函數(shù)
流程控制函數(shù),
說白了,算一個值出一個結(jié)果的就是單行函數(shù),
然而數(shù)據(jù)庫的重點在于數(shù)理統(tǒng)計,意味著我們要處理一組數(shù),返回一些統(tǒng)計量(statistics)(如平均數(shù)(average) 中位數(shù)(median))
那么這樣的統(tǒng)計函數(shù)稱為統(tǒng)計函數(shù)(別名 組函數(shù) 多組函數(shù))
下一站:數(shù)據(jù)庫學(xué)習(xí)之MySQL (十一)——統(tǒng)計函數(shù)
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贪吃蛇程序 php,php Web程序
- 下一篇: xiaocms php,XiaoCms