• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    oracle中日期与字符串的相互转化的方法详解

    发布者: 404号房间 | 发布时间: 2025-6-18 09:23| 查看数: 36| 评论数: 0|帖子模式

    1.字符串转为日期格式(to_date)

    例1:把字符串类型2005-01-01 13:14:20 转成 2005/1/1 13:14:20日期格式
    1. select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;
    复制代码
    结果:

    例2:把字符串类型30-11月-19 转成 2018/12/31 日期格式
    1. select to_date('30-11月-19 ', 'dd-mon-yy') from dual
    复制代码
    结果:

    注意:字符串转日期时,字符串和日期格式要匹配,如字符串格式为30-11月-19,如果后边跟yyyy-MM-dd就会报格式不匹配的错误,必须使用dd-mon-yy

    2.日期格式转字符串(to_char)

    例1:把sysdate(2020/5/12 17:31:23)转化为yyyy-MM-dd HH24:mi:ss字符串格式
    1. select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;
    复制代码
    结果:

    例2:表car.lp_totallpdata中有一个字段enddate字段,代表了结束日期。enddate字段中的数据格式是varchar2类型的:(30-11月-19),现在要求查出表中结束日期等于字符串’2019-11’的数据

    也就是说找出enddate = ‘2019-11’的数据
    分析:
    首先30-11月-19 和 2019-12都属于字符串类型的,但是他们的格式不一样,我们可以先把enddate字段中的数据转化为正常的日期格式,再把他转化为字符串,看他与2019-12是否相等
    1.先把enddate字段中的数据转化为正常的日期格式
    1. to_date(t.enddate, 'dd-mon-yy') //先转化为日期30-11月-19==> 2019/11/30
    复制代码
    2.再把他转化为我们想要的字符串
    1. to_char(to_date(t.enddate, 'dd-mon-yy'),'yyyy-mm') // 2019/11/30 ==> 2019-11
    复制代码
    3.完整的过滤sql
    1. select t.*
    2. from car.lp_totallpdata  t
    3. where to_char(to_date(t.enddate, 'dd-mon-yy'),'yyyy-mm')='2019-11'
    复制代码
    3.日期范围查询

    日期的范围查询,假设要查询 2011-05-02 到 2011-05-30 之间的数据
    这条查询语句有两种实现方式:
    假设数据库的字段 time 为 日期类型,传来的数据为字符串类型!!!
    1. to_date 方式
    把传来的数据 2011-05-02 、 2011-05-02 转化为日期再与time比较
    1. select * from tablename
    2. where time >= to_date('2011-05-02','yyyy-mm-dd')   
    3. and  time <= to_date('2011-05-30','yyyy-mm-dd')
    复制代码
    运行的结果是:可以显示05-02的数据,但是不能显示05-30的数据。
    解决方案:
    ①如果想显示05-30的数据可以<to_date(‘2011-05-31’,‘yyyy-mm-dd’),这样就能显示30号的了。
    ②如果想要显示05-30的数据可以<=to_date(‘2011-05-30 23:59:59 999’,‘yyyy-mm-dd hh24:mi:ss’)也是可以查出来的。
    2.to_char方式:
    把time转化为字符串再与传来的数据 2011-05-02 、 2011-05-02 做比较
    1. select * from tablename
    2. where to_char(time,'yyyy-mm-dd') >= '2011-05-02'   
    3. and to_char(time,'yyyy-mm-dd') <= '2011-05-30'
    复制代码
    查询结果:可以同时显示05-02和05-30的数据。
    3. between … and
    经常看到有人在某段时间区间上喜欢用between … and … ,其实,可以直接地说:这种用法是错误的!
    查看某一天的数据,或某一段时间内的数据,其实是一个左闭、右开的区间内的数据;
    例如:我要查一张表 2011年3月11日到2011年3月24日内所生成的数据,其区间应该为[2011-03-11 00:00:00, 2011-03-25 00:00:00)
    – 即:不包括右边2011-03-25 00:00:00时间点的值!


    4. 等于某日期的查询
    1. 格式化传入的日期字符串与数据库比较
    2. select *
    3. from goods
    4. where g_time=to_date('2018/12/26 10:05:17','yyyy-MM-dd hh:mi:ss');
    复制代码
    1. 格式化数据库的日期与传入的日期字符串比较
    2. select *  
    3. from goods
    4. where carnum = '粤BEK735' and
    5. to_char(damageStartdate, 'yyyy-MM-dd HH24:mi:ss') = '2017-04-05 12:00:00';
    复制代码
    1. 传入值与数据值模糊匹配
    2. select *  
    3. from goods
    4. where carnum = '粤BEK735' and
    5. to_char(damageStartdate, 'yyyy-MM-dd HH24:mi:ss')  like '2017-04-05%';
    复制代码
    5. LocalDateTime的使用
    1.         //转换器
    2.         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    3.         //当前时间
    4.         LocalDateTime time = LocalDateTime.now();

    5.         //日期转字符串
    6.         String localTime = df.format(time);
    7.         System.out.println("LocalDateTime转成String类型的时间:" + localTime);

    8.         //字符串转日期
    9.         LocalDateTime ldt = LocalDateTime.parse("2017-09-28 17:07:05", df);
    10.         System.out.println("String类型的时间转成LocalDateTime:" + ldt);
    11.         //日期转时间戳
    12.         System.out.println("LocalDateTime:2017-09-28T17:07:05 转时间戳:"+ldt.toEpochSecond(ZoneOffset.of("+8")));


    13.         System.out.println("===================================");

    14.         //LocalDateTime把字符串转日期互转 (不带时、分、秒的)
    15.         DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy/M/d");
    16.         
    17.         //字符串转日期
    18.         LocalDate parse = java.time.LocalDate.parse("2016/03/28", dateTimeFormatter1);
    19.         System.out.println("2016/03/28转成日期后:" + parse);

    20.         //日期转字符串
    21.         String format = dateTimeFormatter1.format(parse);
    22.         System.out.println("2016/03/28转成合适的字符串后:" + format);
    复制代码
    运行结果如下:

    查看日期范围间隔
    1.   LocalDate today = LocalDate.now();
    2.   System.out.println("Today:" + today);
    3.   LocalDate oldDate = LocalDate.of(2018, 9, 23);
    4.   System.out.println("OldDate:" + oldDate);

    5.   Period p = Period.between(oldDate, today);
    6.   System.out.printf("目标日期距离今天的时间差:%d 年 %d 个月 %d 天\n", p.getYears(), p.getMonths(), p.getDays());
    复制代码
    运行结果

    案例:
    “startTime”:“2021-10-08 13:21:08”,
    “endTime”:“2021-10-08 13:21:12”,
    求两者的时间差:
    1.    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    2.    LocalDate ldate = LocalDateTime.parse(settlementDetailRequest.getStartTime(), df).toLocalDate();
    3.    LocalDate rdate = LocalDateTime.parse(settlementDetailRequest.getEndTime(), df).toLocalDate();
    4.    Period p = Period.between(ldate, rdate);

    5.    if (p.getYears() > 1 || p.getMonths() > 3 ||(p.getMonths()==3&&p.getDays()>0)) {
    6.        return BaseResp.fail("查询日期范围仅支持三个月!");
    7.    }
    复制代码
    需求案例:找出所有任务中,离当前时间最近的任务信息,并返回!
    1.     @RequestMapping(value = "/memory",method = RequestMethod.GET)
    2.     @ApiOperation("修理厂录入定损任务-记忆功能")
    3.     @ApiImplicitParam(paramType = "query", name = "openid", value = "修理厂openid", required = true, dataType = "String")
    4.     public R memory(@RequestParam("openid") String openid) {

    5.         // 1.获取该openid下的所有定损任务
    6.         List<KfAppointmentDsEntity> memoryInfo = kfAppointmentDsService.list(new QueryWrapper<KfAppointmentDsEntity>().eq("factory_openid", openid));

    7.         // 2.收集所有已提交的定损任务的-提交时间戳
    8.         List<Long> collect = memoryInfo.stream()
    9.                 .map(KfAppointmentDsEntity::getApplyTime)
    10.                 .map(x -> {
    11.                     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    12.                     // 把Date格式转化为时间戳
    13.                     return LocalDateTime.parse(x, formatter).toEpochSecond(ZoneOffset.of("+8"));
    14.                 }).collect(Collectors.toList());

    15.         // 3.通过比较时间戳大小,收集最近一次的提交时间戳
    16.         Long maxTime = collect.get(0);
    17.         for (int i = 0; i < collect.size(); i++) {
    18.             if (maxTime < collect.get(i)) {
    19.                 maxTime = collect.get(i);
    20.             }
    21.         }

    22.         // 4.收集最近一次提交时间的任务信息
    23.         Long finalMaxTime = maxTime;
    24.         List<KfAppointmentDsEntity> entitity = memoryInfo.stream().filter(x -> {
    25.             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    26.             Long everyTime = LocalDateTime.parse(x.getApplyTime(), formatter).toEpochSecond(ZoneOffset.of("+8"));
    27.             return everyTime.equals(finalMaxTime);
    28.         }).collect(Collectors.toList());

    29.                 // 5.属性copy,并返回
    30.         MemoryVo memoryVo = new MemoryVo();
    31.         BeanUtils.copyProperties(entitity.get(0),memoryVo);
    32.         return R.ok().put("data",memoryVo);
    33.     }
    复制代码
    6. between…and查询日期时存在的问题

    场景:用 select * from TABLE where date between ‘2009-1-22’ And ‘2009-1-22’ ,或者 select * from TABLE where date >= ‘2009-1-22’ And date <= ‘2009-1-22’ 查询当天数据,结果查不到数据。
    原因:短日期类型默认Time为00:00:00,所以当使用between作限制条件时,就相当于 between ‘2009-1-22 00:00:00’ and ‘2009-1-22 00:00:00’,因此就查不出数据。使用 >=、<= 时同理
    解决方法:
    方法一
    如果 2009-01-23 00:00:00 没有业务发生的话,也可以让前端直接加一天,写成
    1. select * from table where date between '2009-01-22' and '2009-01-23'
    复制代码
    但这样写会包含 2009-01-23 00:00:00 !
    也可后端直接增加一天,后端解决代码如下:
    1. public class MianTest {
    2.     public static void main(String[] args) {

    3.         //转换器
    4.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    5.         //当前日期
    6.         Date date = new Date(2021-1900,1,28);
    7.         System.out.println(format.format(date)+"+++++++++");
    8.         
    9.         Calendar instance = Calendar.getInstance();
    10.         //把当前日期放进去
    11.         instance.setTime(date);
    12.         //日期向后推一天
    13.         instance.add(instance.DATE,1);

    14.         //这个日期就是日期向后推 1天 的结果
    15.         Date realyTime = instance.getTime();
    16.         System.out.println(format.format(realyTime)+"+++++++++");
    17.     }
    18. }
    复制代码
    结果如下:

    方法二
    如果用String接收的日期,可以让前端按如下方式传数据

    我们在后台对endTime进行修改,增加59:59:59
    1.   //endTime增加一天
    2.   String endTime = vo.getEndTime();
    3.   String replaceTime = endTime.replace("00:00:00", "59:59:59");
    4.   vo.setEndTime(replaceTime);
    复制代码
    也可完成正确的查询结果
    方法三:
    如果用Data接收的日期,可以让前端还按这种方式传数据

    后台为Data类型的endTime增加59:59:59
    1. public class MianTest {
    2.     public static void main(String[] args) {

    3.         //转换器
    4.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    5.         //当前日期
    6.         Date date = new Date(2021-1900,1,8);
    7.         System.out.println(format.format(date)+"+++++++++");

    8.         Calendar instance = Calendar.getInstance();
    9.         //把当前日期放进去
    10.         instance.setTime(date);
    11.         //日期向后推,整数往后推,负数向前推
    12.         instance.add(Calendar.HOUR,23);
    13.         instance.add(Calendar.MINUTE,59);
    14.         instance.add(Calendar.SECOND,59);

    15.         //这个日期就是日期向后推 23:59:59的结果
    16.         Date realyTime = instance.getTime();
    17.         System.out.println(format.format(realyTime)+"+++++++++");
    18.     }
    19. }
    复制代码
    结果如下,也可达成正确的效果

    以上就是oracle中日期与字符串的相互转化的方法详解的详细内容,更多关于oracle日期与字符串相互转化的资料请关注脚本之家其它相关文章!

    来源:https://www.jb51.net/database/327830a4p.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表