mysql⽇期date与字符串string相互转换
1.⽇期转字符串
  date_format(date,format)
  date:需要转换的⽇期;
  format:格式化的样式
  年:  %Y  显⽰四位: 2021;%y    只显⽰后两位:21
⽉:  %M ⽉份的英⽂显⽰:October;%m  ⽉份的阿拉伯显⽰:01-12;%b ⽉份的英⽂缩略显⽰:Oct;%c  ⽉份的阿拉伯显⽰:1-12
⽇:  %d 阿拉伯显⽰:00-31;%D 带有英⽂后缀:1st-31th;%e 阿拉伯显⽰:1-31;%j  年的天:001-366
时:  %H :00-23;%h:01-12;%I(⼤写i):01-12;%k:0-23;%l(⼩写L):1-12
分:  %i:00-59
秒:  %S:00-59;%s:00-59
微妙:%f
AM/PM:%p
12⼩时制时间:%r:  02:02:44 PM
24⼩时制时间: %T:  14:02:44(因此,我们可以使⽤%T来替代%H:%i:%s的组合使⽤)
周: %W:周的英⽂显⽰; %w 周的阿拉伯显⽰:0(星期⽇)-6(星期六); %a 周的英⽂缩略显⽰:Mon-
  举例:
SELECT DATE_FORMAT(now(),'%Y-%m-%d %T') 
SELECT DATE_FORMAT(sysdate(),'%Y-%m-%d %H:%i:%s')
2.字符串转⽇期
  str_to_date(str,format)
  str:字符形式的⽇期;
  format:格式化样式
形式⼀:将字符串格式化到天
  举例:
select STR_TO_DATE('2021-03-26 14:51:19','%Y-%m-%d')
说明:
字符串转⽇期,当只转到天时,数据库会为其⾃动加上0时0分0秒;
上⾯转成⽇期后,实际代表的是:2021年3⽉26⽇0时0分0秒。
更多说明,见⽂末扩展。
形式⼆:将字符串格式化到⼩时
说明:分钟和秒会被⾃动设置成0;
形式三:将字符串格式化到分钟
说明:秒数会被⾃动设置成0;
3.⽇期与字符串做对⽐
  在mysql中,⽇期类型是可以直接和字符串形式的⽇期直接做对⽐的
  date_format⽰例
  str_to_date⽰例
  在实际开发过程中,我们通常需要进⾏⽇期字符串与⽇期字段之间做对⽐,⽽经过上述实验发现:
  ⽇期和字符串可以进⾏直接⽐较。
4.扩展延伸
2022年2⽉9⽇14:30:02
字符串转⽇期(只转到天),在Navicat的展⽰形式如下:
关于⽇期计算
往后推⼀天:
select STR_TO_DATE( '2022-02-09', '%Y-%m-%d' ) + 1
代表的实际⽇期为:2022年2⽉10⽇0时0分0秒。
往后推⼀秒:
-- ⽅式1
select STR_TO_DATE( '2022-02-09', '%Y-%m-%d %H' ) + 1
-- ⽅式2
select STR_TO_DATE( '2022-02-09', '%Y-%m-%d %H:%i' ) + 1
-- ⽅式3
select STR_TO_DATE( '2022-02-09', '%Y-%m-%d %H:%i:%s' ) + 1
往后推⼀年
字符串转成⽇期后,⽆法再转回⽇期
select DATE_FORMAT(STR_TO_DATE( '2022-02-09', '%Y-%m-%d' ), '%Y-%m-%d')
但是,oracle可以这样搞。
由上⾯我们可以知道:
string转date的方法
在将字符串转⽇期时,如果,没有精确到时分秒的话,mysql会⾃动为其添加0时0分0秒;
⽇期转字符串,却可以再次转回⽇期
SELECT STR_TO_DATE(DATE_FORMAT(NOW(), '%Y-%m-%d'), '%Y-%m-%d');
按⽇期区间查询数据
在实际开发过程中,我们经常会按时间区间进⾏查询统计,所以,这就要求我们关于⽇期的计算要计算清楚,否则统计的数据将会被遗漏。
举例说明:查询2022年1⽉8⽇到2022年2⽉9⽇的数据
错误统计是:
错误原因:实际只统计到2022年2⽉9⽇0时0分0秒,2022年2⽉9⽇0时0分1秒~2022年2⽉9⽇23时59分59秒的数据并未被统计进去
⽅式⼀:字符串转⽇期;
开始时间:字符串转⽇期,实际为:2022年1⽉8号0时0分0秒,所以,要⽤>=;
结束时间:字符串转⽇期+1,实际为:2022年2⽉10号0时0分0秒,所以,要⽤<;
正确统计应为:
SELECT
T.INTO_ADDRESS kaKou,
COUNT( 1 ) jiShu
FROM
SC_PERSON_INFO T
WHERE
T.CREATETIME >= STR_TO_DATE( '2022-01-08', '%Y-%m-%d' )
AND T.CREATETIME < STR_TO_DATE( '2022-02-09', '%Y-%m-%d' ) + 1
AND T.INTO_ADDRESS IS NOT NULL
AND T.INTO_ADDRESS != ''
GROUP BY
T.INTO_ADDRESS
ORDER BY
T.INTO_ADDRESS
LIMIT 0,
15
⽅式⼆:将⽇期字段转字符串;
如果觉得字符串转⽇期不好记,那我们可以将⽇期字段转成字符串,这样,就符合我们的记忆了,还不会出错。
查看代码
2022年2⽉17⽇16:15:19
但是,这种⽅式在数据量⼤的时候,将会拖慢查询速度,不建议直接对字段进⾏格式转换;
另外的话,在⽇常开发中,我们常常需要将查询到的数据,按⽇期进⾏降序排列,为了提⾼查询速度,往往,我们会对其创建索引;
因为id本⾝就是唯⼀索引,⽽且id会随着插⼊的数据⽽逐步增⼤,另外,⽇期即使精确到秒也会重复,所以,我们完全可以按照主键进⾏降序排列。
2022年2⽉20⽇16:16:51
⽅式三:⼿动拼上时分秒。
为结束⽇期字符串⼿动补齐时分秒(23:59:59)后,再转⽇期。
查看代码
SELECT
T.INTO_ADDRESS kaKou,
COUNT(1) jiShu
FROM
SC_PERSON_INFO T
WHERE DATE_FORMAT(T.CREATETIME, '%Y-%m-%d') >= '2022-01-08'
AND DATE_FORMAT(T.CREATETIME, '%Y-%m-%d %T') <= CONCAT('2022-02-09', ' 23:59:59')
AND T.INTO_ADDRESS IS NOT NULL
AND T.INTO_ADDRESS != ''
GROUP BY T.INTO_ADDRESS
ORDER BY T.INTO_ADDRESS
LIMIT 0, 15;
当然,为了代码的易读性,我们可以为开始⽇期加上00:00:00,再转⽇期。
查看代码
SELECT
T.INTO_ADDRESS kaKou,
COUNT(1) jiShu
FROM
SC_PERSON_INFO T
WHERE DATE_FORMAT(T.CREATETIME, '%Y-%m-%d %T') >= CONCAT('2022-01-08', ' 00:00:00')
AND DATE_FORMAT(T.CREATETIME, '%Y-%m-%d %T') <= CONCAT('2022-02-09', ' 23:59:59')
AND T.INTO_ADDRESS IS NOT NULL
AND T.INTO_ADDRESS != ''
GROUP BY T.INTO_ADDRESS
ORDER BY T.INTO_ADDRESS
LIMIT 0, 15;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。