MySQL DATE和日期函数
简介:在本教程中,我们将向您介绍MySQL DATE数据类型,并向您展示一些有用的日期函数,以有效地处理日期数据。
MySQL DATE数据类型简介
MySQL DATE是用于管理日期值的五种时态数据类型之一。
MySQL使用yyyy-mm-dd格式存储日期值。
此格式是固定的,无法更改。
例如,您可能更喜欢使用mm-dd-yyyy格式,但不能使用。
取而代之的是,您遵循标准日期格式,然后使用DATE_FORMAT函数以所需的方式格式化日期。
MySQL使用3个字节来存储DATE值。
DATE值的范围是1000-01-01至9999-12-31。
如果您要存储超出此范围的日期值,则需要使用非时间数据类型,例如整数,例如三列,每一列用于年,月和日。
您还需要创建存储函数来模拟MySQL提供的内置日期函数,不建议这样做。
禁用严格模式后,MySQL会将所有无效日期(例如2015-02-30)转换为零日期值的注册信息。
两位数年份的MySQL日期值
MySQL使用四位数字存储日期值的年份。
如果您使用两位数的年份值,MySQL仍会按照以下规则接受它们:
00-69范围内的年份值将转换为2000-2069。
70-99范围内的年份值转换为1970 – 1999。
但是,两位数的日期值不明确,因此应避免使用它。
让我们看看以下示例。
首先,使用DATE数据类型创建一个名为"带出生日期的人"的表。
CREATE TABLE people ( id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, birth_date DATE NOT NULL );
接下来,在people表中插入一行。
INSERT INTO people(first_name,last_name,birth_date) VALUES('John','Doe','1990-09-01');
然后,从人员表中查询数据。
SELECT first_name, last_name, birth_date FROM people;
之后,使用两位数的年份格式将数据插入到人员表中。
INSERT INTO people(first_name,last_name,birth_date) VALUES('Hyman','Daniel','01-09-01'), ('Lily','Bush','80-09-01');
在第一行中,我们使用01(范围为00-69)作为年份,因此MySQL将其转换为2001。
在第二行中,我们使用80(范围为70-99)作为年份,MySQL将其转换为1980。
最后,我们可以从人员表中查询数据,以检查数据是否根据转换规则进行了转换。
SELECT first_name, last_name, birth_date FROM people;
MySQL DATE功能
MySQL提供了许多有用的日期函数,使您可以有效地操纵日期。
要获取当前日期和时间,请使用NOW()函数。
SELECT NOW();
+---------------------+ | NOW() | +---------------------+ | 2017-05-13 07:59:38 | +---------------------+ 1 row in set (0.02 sec)
要仅获取DATETIME值的日期部分,请使用DATE()函数。
SELECT DATE(NOW());
+-------------+ | DATE(NOW()) | +-------------+ | 2015-07-13 | +-------------+ 1 row in set (0.01 sec)
要获取当前系统日期,请使用CURDATE()函数,如下所示:
SELECT CURDATE();
+------------+ | CURDATE() | +------------+ | 2015-07-13 | +------------+ 1 row in set (0.02 sec)
要格式化日期值,请使用DATE_FORMAT函数。
以下语句使用日期格式模式%m /%d /%Y将日期格式设置为mm / dd / yyyy:
SELECT DATE_FORMAT(CURDATE(), '%m/%d/%Y') today;
+------------+ | today | +------------+ | 07/13/2015 | +------------+ 1 row in set (0.02 sec)
要计算两个日期值之间的天数,请使用DATEDIFF函数,如下所示:
SELECT DATEDIFF('2015-11-04','2014-11-04') days;
+------+ | days | +------+ | 365 | +------+ 1 row in set (0.02 sec)
要将日期,星期,月份,年份等添加到日期值中,请使用DATE_ADD函数:
SELECT '2015-01-01' start, DATE_ADD('2015-01-01', INTERVAL 1 DAY) 'one day later', DATE_ADD('2015-01-01', INTERVAL 1 WEEK) 'one week later', DATE_ADD('2015-01-01', INTERVAL 1 MONTH) 'one month later', DATE_ADD('2015-01-01', INTERVAL 1 YEAR) 'one year later';
同样,您可以使用DATE_SUB函数从日期中减去一个间隔:
SELECT '2015-01-01' start, DATE_SUB('2015-01-01', INTERVAL 1 DAY) 'one day before', DATE_SUB('2015-01-01', INTERVAL 1 WEEK) 'one week before', DATE_SUB('2015-01-01', INTERVAL 1 MONTH) 'one month before', DATE_SUB('2015-01-01', INTERVAL 1 YEAR) 'one year before';
如果要获取日期值的日,月,季度和年,可以使用相应的函数DAY,MONTH,QUARTER和YEAR,如下所示:
SELECT DAY('2000-12-31') day, MONTH('2000-12-31') month, QUARTER('2000-12-31') quarter, YEAR('2000-12-31') year;
+------+-------+---------+------+ | day | month | quarter | year | +------+-------+---------+------+ | 31 | 12 | 4 | 2000 | +------+-------+---------+------+ 1 row in set (0.00 sec)
获取周信息周相关功能。
例如,WEEK函数返回星期数,WEEKDAY函数返回工作日索引,而WEEKOFYEAR函数返回日历周。
SELECT WEEKDAY('2000-12-31') weekday, WEEK('2000-12-31') week, WEEKOFYEAR('2000-12-31') weekofyear;
+---------+------+------------+ | weekday | week | weekofyear | +---------+------+------------+ | 6 | 53 | 52 | +---------+------+------------+ 1 row in set (0.04 sec)
如果您未传递第二个参数或传递了0,则week函数将返回从零开始的星期数。
如果传递1,则将返回从1开始的星期数。
SELECT WEEKDAY('2000-12-31') weekday, WEEK('2000-12-31',1) week, WEEKOFYEAR('2000-12-31') weekofyear;
+---------+------+------------+ | weekday | week | weekofyear | +---------+------+------------+ | 6 | 52 | 52 | +---------+------+------------+ 1 row in set (0.00 sec)
在本教程中,您了解了MySQL DATE数据类型以及如何使用一些有用的日期函数来操纵日期值。