MySQL如何插入'17-DEC-80'格式日期并获取对应月份最后一天?
嘿,这个问题我太熟悉了!咱们拆成几个部分一步步解决:
1. 插入格式为'17-DEC-80'的日期到MySQL
MySQL的DATE类型存储的是YYYY-MM-DD格式的数据,但你可以通过STR_TO_DATE()函数把'17-DEC-80'这种字符串格式转换为合法的日期值再插入。
这个函数的格式符对应规则:
%d:两位数字的日期(01-31)%b:缩写的月份名称(Jan、Feb...Dec,大小写不敏感)%y:两位数字的年份(70-99会被解析为1970-1999,00-69解析为2000-2069)
示例插入语句(假设你有一个名为user_dates的表,有event_date字段):
INSERT INTO user_dates (event_date) VALUES (STR_TO_DATE('17-DEC-80', '%d-%b-%y'));
2. 获取日期对应月份的最后一天
MySQL内置了LAST_DAY()函数,它可以直接接收日期值或日期字符串,返回该月份的最后一天。
比如针对刚才的日期,获取月末的语句:
SELECT LAST_DAY(STR_TO_DATE('17-DEC-80', '%d-%b-%y')) AS month_end;
执行后会返回1980-12-31,如果需要转成和输入一样的格式,可以搭配DATE_FORMAT():
SELECT DATE_FORMAT(LAST_DAY(STR_TO_DATE('17-DEC-80', '%d-%b-%y')), '%d-%b-%y') AS month_end_formatted;
这样就会得到31-DEC-80。
3. 插入10条示例数据并批量查询月末日期
先创建一个测试表(如果没有的话):
CREATE TABLE IF NOT EXISTS sample_dates ( id INT AUTO_INCREMENT PRIMARY KEY, source_date DATE NOT NULL );
然后插入10条指定格式的日期数据:
INSERT INTO sample_dates (source_date) VALUES (STR_TO_DATE('01-JAN-81', '%d-%b-%y')), (STR_TO_DATE('10-FEB-82', '%d-%b-%y')), (STR_TO_DATE('15-MAR-83', '%d-%b-%y')), (STR_TO_DATE('20-APR-84', '%d-%b-%y')), (STR_TO_DATE('25-MAY-85', '%d-%b-%y')), (STR_TO_DATE('02-JUN-86', '%d-%b-%y')), (STR_TO_DATE('07-JUL-87', '%d-%b-%y')), (STR_TO_DATE('12-AUG-88', '%d-%b-%y')), (STR_TO_DATE('17-SEP-89', '%d-%b-%y')), (STR_TO_DATE('22-OCT-90', '%d-%b-%y'));
最后执行查询,同时展示原始格式日期和对应月末日期:
SELECT DATE_FORMAT(source_date, '%d-%b-%y') AS input_date, LAST_DAY(source_date) AS month_end_date, DATE_FORMAT(LAST_DAY(source_date), '%d-%b-%y') AS month_end_formatted FROM sample_dates;
小提示
- 如果你担心两位年份的解析问题(比如不想把80当成1980),可以改用
%Y格式符传入四位年份,比如STR_TO_DATE('17-DEC-1980', '%d-%b-%Y')。 - 尽量用
STR_TO_DATE()明确转换格式,不要依赖MySQL的自动转换,避免因系统日期格式设置不同导致的错误。
内容的提问来源于stack exchange,提问作者Jack Sengar
相关产品推荐
相关产品推荐

