其中expr值可以是hi一个负数,因此单纯使用DATE_ADD也可以完成DATE_SUB的操作。
SELECT NOW() AS cur,DATE_ADD(NOW(),INTERVAL -1 DAY) AS yesterday;
如果是闰月的话(比如不是闰年的2月28日加上4年,就会变成闰年的2月29日),DATE_ADD函数返回的日期是2月29日,如果不是闰月,那么返回的日期是2月28日。
SELECT DATE_ADD(‘2000-02-29’,INTERVAL 4 YEAR);
SELECT DATE_ADD(‘2000-02-29’,INTERVAL 5 YEAR);
除了DAY和YEAR之外,还有其他类型的,比如MICROSECOND(微秒会被截断)、SECOND(秒)、MINUTE(分钟)、HOUR、WEEK、MONTH等类型
DATE_FORMAT函数
按照用户的需求格式化打印出日期
SELECT DATE_FORMAT(NOW(),"%Y%m%d");
数字类型
整形
整形类型有INT、SMALLINT、TINYINT、MEDIUMINT和BIGINT。
| 类型 | 占用空间(字节) | 最小值 | 最大值 |
| — | — | — | — |
| TINYINT | 1 | -128(有符号位) | 255 |
| SMALLINT | 2 | -32768(-2^15) | 2^16 |
| MEDIUNINT | 3 | -2^23 | 2^24 |
| INT | 4 | -2^31 | 2^32 |
| BIGINT | 8 | -2^63 | 2^64 |
对于整形,前面有两个相关的属性就是ZEROFILL和UNSIGNED,一旦开启了ZEROFILL那么UNSIGNED也会自动开启。
浮点型(非精确类型)
Mysql支持两种浮点类型,单精度的FLOAT类型以及双精度的DOUBLE PRECISION类型。这两种类型都是非精确的类型,即经过一些操作之后并不能保证运算的准确性,例如M*G/G不一定会等于M。
FLOAT类型用于表示近似数值数据类型,SQL标准允许在关键字FLOAT后面的括号内用位来指定精度(但不能为指数范围)。Mysql还支持可选的只用于确定存储大小的精度规定,0到23的精度对应FLOAT列的4字节单精度,24到53的精度对应DOUBLE列的8字节双精度。
Mysql还允许使用非标准语法,FLOAT(M,D)或REAL(M.D)或DOUBLE PRECISION(M,D)。这里的(M,D)表示该值一共显示M位整数,其中D位是小数点后面的位数。例如FLOAT(7,4)的一个列可以显示为-999.9999。如果超出了范围,Mysql保存值时会进行四舍五入,比如在FLOAT(7,4)中插入999.00009,会变成999.0001。
Mysql将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词,将REAL视为DOUBLE PRECISION(非标准扩展)的同义词,即REAL和DOUBLE都是DOUBLE PRECISION,若将Mysql服务器的模式设置,REAL_AS_FLOAT,那这时REAL会被视为FLOAT类型。
为了保证最大的可以可移植性(保证精确性,因为如果不满长FLOAT参数里面的长度会进行补充),需要使用近似数值数据值存储的代码,使用FLOAT或DOUBLE PRECISION,并不规定精度或者位数。
高精度类型
DECIMAL和NUMERIC类型在Mysql中被视为相同的类型,用于保存必须为确切精度的值,比如工资,当声明该类型的列时,通常必须指定精度和标度(精度指数字位数即保存值的主要位数,标度指小树点后面可以保存的位数),例如 salary DECIMAL(5,2) ,精度为5,标度为2。在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0),M默认是10的。
CREATE TABLE t10(
a DECIMAL
)
SHOW CREATE TABLE t10;