Mybatis日常问题TO_CHAR(deliveryTime,‘yyyy-mm-dd hh24:mi:ss‘)

本文详细解析了在MyBatis中使用Oracle的TO_CHAR函数转换日期格式的方法,尤其是在处理空值时不报错的技巧。通过具体代码示例,展示了如何在插入操作中正确设置日期字段。

mybatis 中Oracle 函数 TO_CHAR(deliveryTime,‘yyyy-mm-dd hh24:mi:ss’) 的用法:

public int insertPayDetailInfo(@Param("serialNumber") String serialNumber,@Param("list") List<LongDistancePayOaDetailDto> longDistancePayOaDetailDtos);

<!-- 方法实现 -->
  <insert id="insertPayDetailInfo">
        INSERT INTO UF_CYHTZFSHLCZJB_DT1 (
        LSH,MXBH,DZLX,HTZFLX,FCBH,FCSJ,HTJE,YFJE,SFJE,BZGS,KKLX,CP
        )
        <foreach collection="list" item="ldpodd" separator="union"
                 open="select serialNumber,ldPayDetailNumber,documentType,contractPayType,deliveryNumber,TO_CHAR(deliveryTime,'yyyy-mm-dd hh24:mi:ss'),contractAmount,
                 amountPayble,actualPaidAmount,submitCompany,chargeType,licencePlateNumber from(" close=")">
            SELECT
            #{serialNumber, jdbcType=VARCHAR} serialNumber,
            #{ldpodd.ldPayDetailNumber, jdbcType=VARCHAR} ldPayDetailNumber,
            #{ldpodd.documentType, jdbcType=VARCHAR} documentType,
            #{ldpodd.contractPayType, jdbcType=VARCHAR} contractPayType,
            #{ldpodd.deliveryNumber, jdbcType=VARCHAR} deliveryNumber,
            #{ldpodd.deliveryTime, jdbcType=VARCHAR} deliveryTime,
            <!--  TO_CHAR( #{ldpodd.deliveryTime},'yyyy-mm-dd hh24:mi:ss') deliveryTime,-->
            #{ldpodd.contractAmount, jdbcType=VARCHAR} contractAmount,
            #{ldpodd.amountPayble, jdbcType=VARCHAR} amountPayble,
            #{ldpodd.actualPaidAmount, jdbcType=VARCHAR} actualPaidAmount,
            #{ldpodd.submitCompany, jdbcType=VARCHAR} submitCompany,
            #{ldpodd.chargeType, jdbcType=VARCHAR} chargeType,
            #{ldpodd.licencePlateNumber, jdbcType=VARCHAR} licencePlateNumber
            from dual
        </foreach>
    </insert>
TO_CHAR( #{createDate, jdbcType=VARCHAR},‘yyyy-mm-dd hh24:mi:ss’) 时间为空不会报错;
TO_CHAR( #{createDate},‘yyyy-mm-dd hh24:mi:ss’) 时间为空报错。
以上代码中 #{ldpodd.deliveryTime, jdbcType=VARCHAR} deliveryTime, 指定了 deliveryTime 的类型,即使为空T O_CHAR(deliveryTime,‘yyyy-mm-dd hh24:mi:ss’) 也不会报错;其实就是 #{} 取值对 null 的处理

在这里插入图片描述
---------------------------------------------分割线,2020年8月4日17:16:01------------------------------------

<think> 我们正在讨论PostgreSQL中日期时间格式字符串'YYYY-MM-DD HH24:MI:SS'的使用方法。用户之前的对话历史中涉及到了BETWEEN AND的使用,以及时间戳转换函数to_timestamp。现在用户明确询问这个格式字符串的用法。 关键点: 1. 这个格式字符串通常用于将字符串转换为时间戳类型(通过to_timestamp或to_date等函数) 2. 也用于将时间戳类型格式化为字符串(通过to_char函数) 3. 注意格式字符串中每个元素的含义(例如:YYYY表示4位年份,MM表示两位月份,DD表示两位日期,HH24表示24小时制的小时,MI表示分钟,SS表示秒) 我们将从以下几个方面进行说明: 一、在字符串转时间戳函数中的使用(to_timestamp, to_date) 二、在时间戳转字符串函数中的使用(to_char) 三、日期时间格式字符串中各元素的含义 四、使用示例 五、注意事项(常见错误) 同时,根据用户之前的引用[1]和[2],他们可能在做一些时间戳的转换操作,所以我们也要注意这些引用中提到的用法。 注意:用户引用[2]中有一个自定义函数,它使用了`to_timestamp(cast(datestr as varchar), 'YYYY-MM-DD HH24:MI:SS.MS')`,这里格式字符串中包含了毫秒(.MS),但用户现在问的是没有毫秒的格式,所以我们主要讲解用户所问的格式。 另外,用户引用[1]中在MyBatis的XML映射文件中使用了`to_timestamp(#{date}, 'YYYY-mm-dd hh24:mi:ss')`,这里注意格式字符串中月份用了小写的mm(这是正确的,因为分钟是MI),但是年份用了大写的YYYY,月份用了小写的mm,这是允许的,但通常月份用MM(大写)也是可以的,不过PostgreSQL中大小写不敏感,但为了统一,建议使用大写。 值得注意的是,在PostgreSQL中,分钟必须使用MI(因为m已经被月份占用),而月份可以用MMmm(但推荐用MM,因为mm在有些数据库中表示分钟,为了避免混淆,PostgreSQL中分钟用MI,月份用MM)。 下面开始组织回答。 </think> 以下是 PostgreSQL 中 `YYYY-MM-DD HH24:MI:SS` 日期时间格式的详细使用方法及注意事项: ### 一、核心用途 #### 1. 字符串转时间戳 (`to_timestamp`) ```sql -- 将文本转为 TIMESTAMP 类型 SELECT to_timestamp('2023-07-15 14:30:45', 'YYYY-MM-DD HH24:MI:SS') AS timestamp; -- 返回: 2023-07-15 14:30:45 ``` #### 2. 时间戳转字符串 (`to_char`) ```sql -- 将 TIMESTAMP 类型转为格式化文本 SELECT to_char(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS formatted_time; -- 返回: 2023-07-15 14:30:45 (当前时间) ``` #### 3. 时间计算 ```sql -- 计算7天后的具体时间 SELECT (CURRENT_TIMESTAMP + INTERVAL '7 days')::TIMESTAMP AS future_time; ``` --- ### 二、格式符号详解 | 符号 | 含义 | 示例值 | |--------|---------------|-------------| | `YYYY` | 4位年份 | 2023 | | `MM` | 2位月份(01-12) | 07 | | `DD` | 2位日期(01-31) | 15 | | `HH24` | 24小时制小时 | 14 (下午2点) | | `MI` | 分钟(00-59) | 30 | | `SS` | 秒数(00-59) | 45 | --- ### 三、实际应用示例 #### 1. 条件筛选(结合 WHERE) ```sql SELECT * FROM orders WHERE created_at >= to_timestamp('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND created_at < to_timestamp('2023-01-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS'); ``` #### 2. 数据格式化输出 ```sql SELECT order_id, to_char(created_at, 'YYYY-MM-DD HH24:MI:SS') AS create_time FROM orders; ``` #### 3. 毫秒精度扩展(如引用[2]) ```sql -- 添加毫秒(.MS) SELECT to_char(NOW(), 'YYYY-MM-DD HH24:MI:SS.MS'); -- 返回: 2023-07-15 14:30:45.789 ``` --- ### 四、关键注意事项 1. **大小写敏感**: - 分钟必须用 `MI`(不是 `mm`) - 24小时制必须用 `HH24`(`hh` 是12小时制) 2. **月份格式陷阱**: ```sql -- 错误示范 (月份用 mm 会导致解析错误) SELECT to_timestamp('2023-07-15', 'YYYY-mm-DD'); -- 报错 -- 正确用法 (月份用 MM) SELECT to_timestamp('2023-07-15', 'YYYY-MM-DD'); -- 成功 ``` 3. **时区处理**: ```sql -- 显式指定时区转换 SELECT to_timestamp('2023-07-15 14:30:45+08', 'YYYY-MM-DD HH24:MI:SS TZH'); ``` 4. **性能优化**: - 对 `TIMESTAMP` 列创建索引可加速范围查询 - 避免在 WHERE 子句中对列使用函数(先转换参数值) --- ### 五、与编程语言集成 #### MyBatis 示例(如引用[1]) ```xml <select id="getUsersAfterDate"> SELECT * FROM users WHERE created_time >= to_timestamp(#{date}, 'YYYY-MM-DD HH24:MI:SS') </select> ``` #### Java 传参 ```java // 确保字符串格式完全匹配 Map<String, Object> params = new HashMap<>(); params.put("date", "2023-07-15 14:30:45"); sqlSession.selectList("getUsersAfterDate", params); ``` [^1][^2] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值