菜鸟的mysql踩坑之路

以前一直使用的oracle,对mysql不是很了解。最近换了新公司,使用的是mysql,刚开始用的时候真的各种不习惯,今天刚好有时间,整理一下最近使用mysql遇到的一些问题。

1.MySQL中NULL和空字符串的区别以及注意点:
有一次行转列的时候,我想使用ifnull()函数把空字段全部转换成'null'字符串方便做处理,结果发现只有部分空字段变成了'null'字符串,我百思不得其解,仔细看了一下数据发现表中有些空的字段显示了null,有些则没有。以前使用oracle,在oracle中null和空值是没有区别的(┬_┬)。查了一下才发现mysql中空值和null是有区别的。
-----------------------------------------------------------------------------
①在mysql中,空值是不占用空间的。但NULL是占用空间的。
②在进行count()统计某列的记录数的时候,如果是NULL值,系统会自动忽略掉,但空值是会进行统计到其中的。
③判断NULLIS NULL 或者 IS NOT NULL, SQL语句函数中可以使用ifnull()函数来进行处理,判断空字符用=’‘或者 <>’'来进行处理。
④对于MySQL特殊的注意事项,对于timestamp数据类型,如果插入NULL值,出现的值是当前系统时间。插入空值,出现的值是 0000-00-00 00:00:00

2.MySQL中0和空值,空格,tab,回车是否相等:
还是在行转列的时候,因为控制不了数据库中别人插入的是空值还是null,所以我想用ifnull( NULLIF( column, '' ), 'null' )把所有空值和null都转成'null'字符串来方便我做处理。结果发现有些int类型字段值为0的也都变成了'null'字符串,又懵逼了,我太难了。后来查了一下发现还真的是有猫腻。
-----------------------------------------------------------------------------

select 0 = '';//1
select 0 = ' ';//1
select 0 = '    ';//tab符号,1
select 0 = '
';           //回车符号,1

在mysql中0和空值,空格,tab,回车都是相等的,至于mysql为什么这么设定,我也不知道。所以如果不想让0和这些值相等,可以把字段设置成varchar类型,就不会有这些问题啦!

3.mysql中的常用内置函数:
因为刚使用mysql,对于其内置函数不是很熟悉,下面copy了一下mysql内置的一些函数,供和我一样初涉mysql的小伙伴学习。
转自mysql中的内置函数
-----------------------------------------------------------------------------
①数学函数

abs(x)
pi()
mod(x,y)
sqrt(x)
ceil(x)或者ceiling(x)
rand(),rand(N):返回0-1间的浮点数,使用不同的seed N可以获得不同的随机数
round(x, D):四舍五入保留D位小数,D默认为0, 可以为负数, 如round(19, -1)返回20
truncate(x, D):截断至保留D位小数,D可以为负数, 如trancate(19,-1)返回10
sign(x): 返回x的符号,正负零分别返回1, -1, 0
pow(x,y)或者power(x,y)
exp(x):e^x
log(x):自然对数
log10(x):以10为底的对数
radians(x):角度换弧度
degrees(x):弧度换角度
sin(x)和asin(x):
cos(x)和acos(x):
tan(x)和atan(x):
cot(x):

②字符串函数

char_length(str):返回str所包含的字符数,一个多字节字符算一个字符
length(str): 返回字符串的字节长度,如utf8中,一个汉字3字节,数字和字母算一个字节
concat(s1, s1, ...): 返回连接参数产生的字符串
concat_ws(x, s1, s2, ...): 使用连接符x连接其他参数产生的字符串
INSERT(str,pos,len,newstr):返回str,其起始于pos,长度为len的子串被newstr取代。
1. 若pos不在str范围内,则返回原字符串str
2. 若str中从pos开始的子串不足len,则将从pos开始的剩余字符用newstr取代
3. 计算pos时从1开始,若pos=3,则从第3个字符开始替换
lower(str)或者lcase(str):
upper(str)或者ucase(str):
left(s,n):返回字符串s最左边n个字符
right(s,n): 返回字符串最右边n个字符
lpad(s1, len, s2): 用s2在s1左边填充至长度为len, 若s1的长度大于len,则截断字符串s1至长度len返回
rpad(s1, len, s2):
ltrim(s):删除s左侧空格字符
rtrim(s):
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str)或TRIM([remstr FROM] str):从str中删除remstr, remstr默认为空白字符
REPEAT(str,count):返回str重复count次得到的新字符串
REPLACE(str,from_str,to_str): 将str中的from_str全部替换成to_str
SPACE(N):返回长度为N的空白字符串
STRCMP(str1,str2):若str1和str2相同,返回0, 若str1小于str2, 返回-1, 否则返回1.
SUBSTRING(str,pos), SUBSTRING(str FROM pos), SUBSTRING(str,pos,len), SUBSTRING(str FROM pos FOR len),MID(str,pos,len): 获取特定位置,特定长度的子字符串
LOCATE(substr,str), LOCATE(substr,str,pos),INSTR(str,substr),POSITION(substr IN str): 返回字符串中特定子串的位置,注意这里INSTR与其他函数的参数位置是相反的
REVERSE(str)
ELT(N,str1,str2,str3,...):返回参数strN, 若N大于str参数个数,则返回NULL
FIELD(str,str1,str2,str3,...): 返回str在后面的str列表中第一次出现的位置,若找不到str或者str为NULL, 则返回0
FIND_IN_SET(str,strlist):strlist是由','分隔的字符串,若str不在strlist或者strlist为空字符串,则返回0;若任意一个参数为NULL则返回NULL
MAKE_SET(bits,str1,str2,...): 由bits的作为位图来选取strN参数,选中的参数用','连接后返回

③日期和时间函数

CURDATE(), CURRENT_DATE, CURRENT_DATE():用于获取当前日期,格式为'YYYY-MM-DD'; 若+0则返回YYYYMMDD
UTC_DATE, UTC_DATE():返回当前世界标准时间
CURTIME([fsp]), CURRENT_TIME, CURRENT_TIME([fsp]): 用于获取当前时间, 格式为'HH:MM:SS' 若+0则返回 HHMMSS
UTC_TIME, UTC_TIME([fsp])
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP([fsp]), LOCALTIME, LOCALTIME([fsp]), SYSDATE([fsp]), NOW([fsp]): 用于获取当前的时间日期,格式为'YYYY-MM-DD HH:MM:SS',若+0则返回YYYYMMDDHHMMSS
UTC_TIMESTAMP, UTC_TIMESTAMP([fsp])
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date):返回一个unix时间戳('1970-01-01 00:00:00' UTC至今或者date的秒数),这实际上是从字符串到整数的一个转化过程
FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format):从时间戳返回'YYYY-MM-DD HH:MM:SS' 或者YYYYMMDDHHMMSS,加入format后根据所需的format显示。
MONTH(date)
MONTHNAME(date)
DAYNAME(date)
DAY(date),DAYOFMONTH(date):1-31或者0
DAYOFWEEK(date):1-7==>星期天-星期六
DAYOFYEAR(date): 1-365(366)
WEEK(date[,mode]):判断是一年的第几周,如果1-1所在周在新的一年多于4天,则将其定为第一周;否则将其定为上一年的最后一周。mode是用来人为定义一周从星期几开始。
WEEKOFYEAR(date):类似week(date,3),从周一开始计算一周。
QUARTER(date):返回1-4
HOUR(time):返回时间中的小时数,可以大于24
MINUTE(time):
SECOND(time):
EXTRACT(unit FROM date):提取日期时间中的要素

SELECT EXTRACT(YEAR FROM '2009-07-02'); ##2009
SELECT EXTRACT(YEAR_MONTH FROM '2009-07-02 01:02:03');##200907
SELECT EXTRACT(DAY_MINUTE FROM '2009-07-02 01:02:03');##20102
SELECT EXTRACT(MICROSECOND FROM '2003-01-02 10:30:00.000123');##123

TIME_TO_SEC(time)
SEC_TO_TIME(seconds)
TO_DAYS(date): 从第0年开始的天数
TO_SECNDS(expr):从第0年开始的秒数
ADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days),DATE_ADD(date,INTERVAL expr unit)
DATE_SUB(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit)
ADDTIME(expr1,expr2)
SUBTIME(expr1,expr2)

SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002');##'2008-01-02 01:01:01.000001'
SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');##'03:00:01.999997'
注意:时间日期的加减也可以直接用+/-来进行
date + INTERVAL expr unit
date - INTERVAL expr unit
如:
SELECT '2008-12-31 23:59:59' + INTERVAL 1 SECOND;##'2009-01-01 00:00:00'
SELECT INTERVAL 1 DAY + '2008-12-31';##'2009-01-01'
SELECT '2005-01-01' - INTERVAL 1 SECOND;##'2004-12-31 23:59:59'

DATE_FORMAT(date,format):
DATEDIFF(expr1,expr2):返回相差的天数
TIMEDIFF(expr1,expr2):返回相隔的时间

④条件判断函数

IF(expr1,expr2,expr3):如果expr1不为0或者NULL,则返回expr2的值,否则返回expr3的值
IFNULL(expr1,expr2):如果expr1不为NULL,返回expr1,否则返回expr2
NULLIF(expr1,expr2): 如果expr1=expr2则返回NULL, 否则返回expr1
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
当compare_value=value时返回result
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
当condition为TRUE时返回result

SELECT CASE 1 WHEN 1 THEN 'one'
WHEN 2 THEN 'two' ELSE 'more' END;##'one'
SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;##'true'
SELECT CASE BINARY 'B'
WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;##NULL

⑤系统信息函数

VERSION():返回mysql服务器的版本,是utf8编码的字符串
CONNECTION_ID():显示连接号(连接的线程号)
DATABASE(),SCHEMA():显示当前使用的数据库
SESSION_USER(), SYSTEM_USER(), USER(), CURRENT_USER, CURRENT_USER():返回当前的用户名@主机,utf8编码字符串
CHARSET(str)
COLLATION(str)
LAST_INSERT_ID():自动返回最后一个insert或者update查询, 为auto_increment列设置的第一个发生的值

⑥加密和压缩函数

PASSWORD(str):这个函数的输出与变量old_password有关。old_password 在mysql5.6中默认为0。 不同取值的效果如下表

取值效果

old_password=1时, password(str)的效果与old_password(str)相同,由于其不够安全已经弃用(5.6.5以后)。
old_password=2时,在生成哈希密码时会随机加盐。
MD5(str):计算MD5 128位校验和,返回32位16进制数构成的字符串,当str为NULL时返回NULL。可以用作哈希密码
SHA1(str), SHA(str):计算160位校验和,返回40位16进制数构成的字符串,当str为NULL时返回NULL。
SHA2(str, hash_length):计算SHA-2系列的哈希方法(SHA-224, SHA-256, SHA-384, and SHA-512). 第一个参数为待校验字符串,第二个参数为结果的位数(224, 256, 384, 512)
ENCRYPT(str[,salt]): 用unix crypt()来加密str. salt至少要有两位字符,否则会返回NULL。若未指定salt参数,则会随机添加salt。
ECODE(crypt_str,pass_str):解密crypt_str, pass_str用作密码
ENCODE(str,pass_str):用pass_str作为密码加密str
DES_ENCRYPT(str[,{key_num|key_str}]):用Triple-DES算法编码str, 这个函数只有在mysql配置成支持ssl时才可用。
DES_DECRYPT(crypt_str[,key_str])
AES_ENCRYPT(str,key_str[,init_vector])
AES_DECRYPT(crypt_str,key_str[,init_vector])
COMPRESS(string_to_compress):返回二进制码
UNCOMPRESS(string_to_uncompress)

⑦聚合函数

若在没使用group by时使用聚合函数,相当于把所有的行都归于一组来进行处理。除非特殊说明,一般聚合函数会忽略掉NULL.
AVG([DISTINCT] expr): 返回expr的平均值,distinct选项用于忽略重复值
COUNT([DISTINCT] expr):返回select中expr的非0值个数,返回值为bigint类型
group_concat:连接组内的非空值,若无非空值,则返回NULL

GROUP_CONCAT([DISTINCT] expr [,expr ...]
     [ORDER BY {unsigned_integer | col_name | expr}
            [ASC | DESC] [,col_name ...]]
    [SEPARATOR str_val])

MAX([DISTINCT] expr)
MIN([DISTINCT] expr)
SUM([DISTINCT] expr)
VAR_POP(expr)
VARIANCE(expr):同VAR_POP(expr),但是这是标准sql的一个扩展函数
VAR_SAMP(expr)
STD(expr): 这是标准sql的一个扩展函数
STDDEV(expr):这个函数是为了跟oracle兼容而设置的
STDDEV_POP(expr):这个是sql标准函数
STDDEV_SAMP(expr):样本标准差

⑧格式或类型转化函数

FORMAT(X,D[,locale]):将数字X转化成'#,###,###.##'格式,D为保留的小数位数
CONV(N,from_base,to_base):改变数字N的进制,返回值为该进制下的数字构成的字符串
INET_ATON(expr):ip字符串转数字
INET_NTOA(expr):数字转ip字符串
CAST(expr AS type):转换数据类型
CONVERT(expr,type), CONVERT(expr USING transcoding_name): type可以为BINARY[(N)],CHAR[(N)],DATE,DATETIME, DECIMAL[(M[,D])],DECIMAL[(M[,D])],TIME,UNSIGNED [INTEGER]等等。transcoding_name如utf8等等

4.mysql中的日期函数与日期转换格式化函数:
mysql中日期格式化也和oracle有很多不同的地方,因为我平时使用较多日期格式转换所以这边也找了一份比较完整的日期函数与日期转换格式化函数。转自日期函数与日期转换格式化函数大全
-----------------------------------------------------------------------------

1、DAYOFWEEK(date)
SELECT DAYOFWEEK('2016-01-16') 
SELECT DAYOFWEEK('2016-01-16 00:00:00')
-> 7 (表示返回日期date是星期几,记住:星期天=1,星期一=2, ... 星期六=7)

2、WEEKDAY(date)
SELECT WEEKDAY('2016-01-16') 
SELECT WEEKDAY('2016-01-16 00:00:00')
-> 5 (表示返回date是在一周中的序号,西方日历中通常一周的开始是星期天,并且以0开始计数,所以,记住:0=星期一,1=星期二, ... 5=星期六)

3、DAYOFMONTH(date)
SELECT DAYOFMONTH('2016-01-16') 
SELECT DAYOFMONTH('2016-01-16 00:00:00')
-> 16 (表示返回date是当月的第几天,1号就返回1,... ,31号就返回31)

4、DAYOFYEAR(date)
SELECT DAYOFYEAR('2016-03-31') 
SELECT DAYOFYEAR('2016-03-31 00:00:00')
-> 91 (表示返回date是当年的第几天,01.01返回1,... ,12.31就返回365)

5、MONTH(date)
SELECT MONTH('2016-01-16') 
SELECT MONTH('2016-01-16 00:00:00')
-> 1 (表示返回date是当年的第几月,1月就返回1,... ,12月就返回12)

6、DAYNAME(date)
SELECT DAYNAME('2016-01-16') 
SELECT DAYNAME('2016-01-16 00:00:00')
-> Saturday (表示返回date是周几的英文全称名字)

7、MONTHNAME(date)
SELECT MONTHNAME('2016-01-16') 
SELECT MONTHNAME('2016-01-16 00:00:00')
-> January (表示返回date的是当年第几月的英文名字)

8、QUARTER(date)
SELECT QUARTER('2016-01-16') 
SELECT QUARTER('2016-01-16 00:00:00')
-> 1 (表示返回date的是当年的第几个季度,返回1,2,3,4)

9、WEEK(date,index)
SELECT WEEK('2016-01-03') 
SELECT WEEK('2016-01-03', 0) 
SELECT WEEK('2016-01-03', 1)
-> 1 (该函数返回date在一年当中的第几周,date(01.03)是周日,默认是以为周日作为一周的第一天,函数在此处返回1可以有两种理解:1、第一周返回0,第二周返回1,.... ,2、以当年的完整周开始计数,第一周返回1,第二周返回2,... ,最后一周返回53)
-> 1 (week()默认index就是0. 所以结果同上)
-> 0 (当index为1时,表示一周的第一天是周一,所以,4号周一才是第二周的开始日)

10、YEAR(date)
SELECT YEAR('70-01-16') 
SELECT YEAR('2070-01-16') 
SELECT YEAR('69-01-16 00:00:00')
-> 1970 (表示返回date的4位数年份)
-> 2070 
-> 1969
要注意的是:如果年份只有两位数,那么自动补全的机制是以默认时间1970.01.01为界限的,>= 70 的补全 19,< 70 的补全 20

11、HOUR(time)
SELECT HOUR('11:22:33') 
SELECT HOUR('2016-01-16 11:22:33')
-> 11
-> 11
返回该date或者time的hour值,值范围(0-23)

12、MINUTE(time)
SELECT MINUTE('11:22:33') 
SELECT MINUTE('2016-01-16 11:44:33')
-> 22
-> 44
返回该time的minute值,值范围(0-59)

13、SECOND(time)
SELECT SECOND('11:22:33') 
SELECT SECOND('2016-01-16 11:44:22')
-> 33
-> 22
返回该time的minute值,值范围(0-59)

14、PERIOD_ADD(month,add)
SELECT PERIOD_ADD(1601,2) 
SELECT PERIOD_ADD(191602,3) 
SELECT PERIOD_ADD(191602,-3)
-> 201603
-> 191605
-> 191511
该函数返回对month做增减的操作结果,month的格式为yyMM或者yyyyMM,返回的都是yyyyMM格式的结果,add可以传负值

15、PERIOD_DIFF(monthStart,monthEnd)
SELECT PERIOD_DIFF(1601,1603) 
SELECT PERIOD_DIFF(191602,191607) 
SELECT PERIOD_DIFF(1916-02,1916-07) 
SELECT PERIOD_DIFF(1602,9002)
-> -2
-> -5
-> 5
-> 312
该函数返回monthStart - monthEnd的间隔月数

16、DATE_ADD(date,INTERVAL number type),同 ADDDATE()
SELECT DATE_ADD("2015-12-31 23:59:59",INTERVAL 1 SECOND) 
SELECT DATE_ADD("2015-12-31 23:59:59",INTERVAL 1 DAY) 
SELECT DATE_ADD("2015-12-31 23:59:59",INTERVAL "1:1" MINUTE_SECOND) 
SELECT DATE_ADD("2016-01-01 00:00:00",INTERVAL "-1 10" DAY_HOUR)
-> 2016-01-01 00:00:00
-> 2016-01-01 23:59:59
-> 2016-01-01 00:01:00
-> 2015-12-30 14:00:00
DATE_ADD()和ADDDATE()返回对date操作的结果

     1)date的格式可以是"15-12-31",可以是"15-12-31 23:59:59",也可以是"2015-12-31 23:59:59",如果参数date是date格式,则返回date格式结果,如果参数date是datetime格式,则返回datetime格式结果
     
     2)type格式:
         SECOND 秒 SECONDS
         MINUTE 分钟 MINUTES
         HOUR 时间 HOURS
         DAY 天 DAYS
         MONTH 月 MONTHS
         YEAR 年 YEARS
         MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS" 
         HOUR_MINUTE 小时和分钟 "HOURS:MINUTES" 
         DAY_HOUR 天和小时 "DAYS HOURS" 
         YEAR_MONTH 年和月 "YEARS-MONTHS" 
         HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS" 
         DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES" 
         DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"
     
     
     3)另外,如果不用函数,也可以考虑用操作符"+","-",例子如下:
     SELECT "2016-01-01" - INTERVAL 1 SECOND 
     SELECT "2016-01-01" - INTERVAL 1 DAY 
     SELECT '2016-12-31 23:59:59' + INTERVAL 1 SECOND 
     SELECT '2016-12-31 23:59:59' + INTERVAL "1:1" MINUTE_SECOND
     返回结果:
     -> 2015-12-31 23:59:59
     -> 2015-12-31
     -> 2017-01-01 00:00:00
     -> 2017-01-01 00:01:00

17、DATE_SUB(date,INTERVAL number type),同 SUBDATE()
用法和DATE_ADD()与ADDDATE()类似,一个是加,一个是减,用时参照16点,具体用法请参考DATE_ADD()与ADDDATE()。

18、TO_DAYS(date)
SELECT TO_DAYS('2016-01-16') 
SELECT TO_DAYS('20160116') 
SELECT TO_DAYS('160116')
-> 736344
-> 736344
-> 736344
返回西元0年至日期date是总共多少天

19、FROM_DAYS(date)
SELECT FROM_DAYS(367)
-> 0001-01-02
返回西元0年至今多少天的DATE值

20、DATE_FORMAT(date,format):根据参数对date进行格式化。
SELECT DATE_FORMAT('2016-01-16 22:23:00','%W %M %Y') 
SELECT DATE_FORMAT('2016-01-16 22:23:00','%D %y %a %d %m %b %j') 
SELECT DATE_FORMAT('2016-01-16 22:23:00','%H %k %I %r %T %S %w') 
SELECT DATE_FORMAT('2016-01-16 22:23:00','%Y-%m-%d %H:%i:%s')
-> Saturday January 2016
-> 16th 16 Sat 16 01 Jan 016
-> 22 22 10 10:23:00 PM 22:23:00 00 6
-> 2016-01-16 22:23:00
format的格式都列出来:

    %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), 这里星期一是星期的第一天 
    %% 字符% )
TIME_FORMAT(time,format): 
具体用法和DATE_FORMAT()类似,但TIME_FORMAT只处理小时、分钟和秒(其余符号产生一个NULL值或0)

21、获取系统当前日期
SELECT CURDATE() 
SELECT CURRENT_DATE()
-> 2016-01-16
-> 2016-01-16

22、获取系统当前时间
SELECT CURTIME() 
SELECT CURRENT_TIME()
-> 17:44:22
-> 17:44:22

23、NOW(),SYSDATE(),CURRENT_TIMESTAMP(),LOCALTIME():获取系统当前日期和时间
SELECT NOW() 
SELECT SYSDATE() 
SELECT CURRENT_TIMESTAMP() 
SELECT CURRENT_TIMESTAMP 
SELECT LOCALTIME() 
SELECT LOCALTIME
-> 2016-01-16 17:44:41
-> 2016-01-16 17:44:41
-> 2016-01-16 17:44:41
-> 2016-01-16 17:44:41
-> 2016-01-16 17:44:41
-> 2016-01-16 17:44:41

24、UNIX_TIMESTAMP(date):获取时间戳
SELECT UNIX_TIMESTAMP() 
SELECT UNIX_TIMESTAMP('2016-01-16') 
SELECT UNIX_TIMESTAMP('2016-01-16 23:59:59')
-> 1452937627
-> 1452873600
-> 1452959999

25、FROM_UNIXTIME(unix_timestamp,format):把时间戳转化成日期时间
SELECT FROM_UNIXTIME(1452959999) 
SELECT FROM_UNIXTIME(1452959999,'%Y-%m-%d %H:%i:%s')
-> 2016-01-16 23:59:59
-> 2016-01-16 23:59:59

26、SEC_TO_TIME(seconds):把秒数转化成时间
SELECT SEC_TO_TIME(2378)
-> 00:39:38

27、TIME_TO_SEC(time):把时间转化成秒数
SELECT TIME_TO_SEC('22:23:00')
-> 2378

28、ADDTIME(time,times):把times加到time上
SELECT ADDTIME("2015-12-31 23:59:59",'01:01:01')
-> 2016-01-01 01:01:00

29、CONVERT_TZ(date,from_tz ,to_tz ):转换时区
SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00')
-> 2004-01-01 22:00:00

30、STR_TO_DATE(date,format ):将字符串转成format格式的日期时间
SELECT STR_TO_DATE('2015-01-01', '%Y-%m-%d')
-> 2015-01-01

31、LAST_DAY(date ):获取date当月最后一天的日期
SELECT LAST_DAY(SYSDATE()) 
SELECT LAST_DAY('2015-02-02') 
SELECT LAST_DAY('2015-02-02 00:22:33')
-> 2016-01-31
-> 2015-02-28
-> 2015-02-28

32、MAKEDATE(year ,dayofyear ):根据参数(年份,第多少天)获取日期
SELECT MAKEDATE(2015 ,32)
-> 2015-02-01

33、 MAKETIME(hour ,minute ,second ):根据参数(时,分,秒)获取时间
SELECT MAKETIME(12 ,23 ,34 )
-> 12:23:34

34、YEARWEEK(date):获取日期的年和周
SELECT YEARWEEK(SYSDATE()) 
SELECT YEARWEEK('2015-01-10') 
SELECT YEARWEEK('2015-01-10',1)
-> 201602
-> 201501
-> 201502

35、WEEKOFYEAR(date):获取当日是当年的第几周
SELECT WEEKOFYEAR(SYSDATE()) 
SELECT WEEKOFYEAR('2015-01-10')
-> 2
-> 2
-> 2
-> 2

mysql中常用的几种时间格式转换函数整理如下
      1)from_unixtime(timestamp, format):
      
      timestamp为int型时间,如14290450779;format为转换的格式,包含格式如下:
      
      %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), 这里星期一是星期的第一 
      
      2)unix_timestamp(date):
      作用与from_unixtime()刚好相反,前者是把unix时间戳转换为可读的时间,而unix_timestamp()是把可读的时间转换为unix时间戳,这在对datetime存储的时间进行排序时会用到。如unix_timestamp('2009-08-06 10:10:40'),得到1249524739。
      如果unix_timestamp()不传参数,则调用now()函数自动取当前时间。
      
      3)date_format(date, format):
      date_format()是将date或datetime类型值转换为任意的时间格式。比如常见的应用场景,某表有一个字段是更新时间,存储的是datetime类型,但前台展示时只需要显示年月日(xxxx-xx-xx),这个时候就可以用date_format(date,'%Y-%m-%d ')处理,而不需要在结果集中用程序循环处理。

暂时收集了这些mysql的注意点,希望能给和我一样刚刚使用mysql的萌新一点帮助,文中如有什么不对之处还请各位大佬拍砖斧正。我也会持续更新使用中遇到的问题分享给大家。

你可能感兴趣的:(数据库,mysql)