オラクルデータベース
データベースの時間型は DATE
TO_CHAR です。 日付または数値を文字列に変換します。
TO_DATE 文字列をデータベースの日付型に変換します。 TO_DATE(char, 'format') TO_NUMBER 文字列を数値に変換します。 TO_NUMBER
(char, 'format')
1. 入力パラメータはString型データです。
mybatisの処理時間範囲
TO_DATE 関数を使用して、文字列型の時刻を yyyy-MM-dd 形式の時刻に変換します。
このように時間範囲のクエリでは問題が発生します。VOUCHER_TIME は時、分、秒に固有であり、TO_DATE(#{jyzbLedger.voucherTimeFrom},'yyyy-MM-dd') であるため、この時点では = 記号は無効になります。 )を時間に換算すると失われ、時、分、秒の==判定が無効となります。最終的には同等のデータが失われます
<if test="jyzbLedger.voucherTimeTo != null and jyzbLedger.voucherTimeTo != ''">
and VOUCHER_TIME <![CDATA[>= ]]> TO_DATE(#{jyzbLedger.voucherTimeTo},'yyyy-MM-dd')
</if>
<if test="jyzbLedger.voucherTimeFrom != null and jyzbLedger.voucherTimeFrom != ''">
and VOUCHER_TIME <![CDATA[<= ]]> TO_DATE(#{jyzbLedger.voucherTimeFrom},'yyyy-MM-dd')
</if>
正しい書き方
まず、TO_CHAR を使用して日付を yyyy-MM-dd 形式の文字列に変換し、次に TO_DATE を使用して日付に変換します。
<if test="jyzbLedger.voucherTimeTo != null and jyzbLedger.voucherTimeTo != ''">
and TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) <![CDATA[>= ]]> TO_DATE(#{jyzbLedger.voucherTimeTo},'yyyy-MM-dd')
</if>
<if test="jyzbLedger.voucherTimeFrom != null and jyzbLedger.voucherTimeFrom != ''">
and TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) <![CDATA[<= ]]> TO_DATE(#{jyzbLedger.voucherTimeFrom},'yyyy-MM-dd')
</if>
MybatisPlus の時間範囲クエリ
queryWrapper
.apply(ObjectUtils.isNotEmpty(jyzbLedger.getVoucherTimeTo()),
"TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) >= TO_DATE ({0},'yyyy-MM-dd')", jyzbLedger.getVoucherTimeTo())
.apply(ObjectUtils.isNotEmpty(jyzbLedger.getVoucherTimeFrom()),
"TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' ) <= TO_DATE ({0},'yyyy-MM-dd')", jyzbLedger.getVoucherTimeFrom());
TO_DATE( TO_CHAR( VOUCHER_TIME, 'yyyy-MM-dd' ), 'yyyy-MM-dd' )
2. 入力パラメータはDate型の時刻データです。
Date类型
パラメータを受け取るには、フロントエンドでパラメータの転送形式を固定して使用する必要がありますが、yyyy-MM-dd
@DateTimeFormat@DateTimeFormat格式化
を使用せずにDate 型を使用してパラメータを受け取ると、エラーが報告されます。
mybatisの処理時間範囲
TO_CHAR 日付または数値を文字列に変換します
TO_CHAR 関数を使用して、入力日付形式を指定した形式文字列に変換し、クエリ パラメータを指定した形式文字列に変換します。
<!-- voucherTimeTo为Date类型时不能用 jyzbLedger.voucherTimeTo != '' 判空会报错的 -->
<if test="jyzbLedger.voucherTimeTo != null ">
and to_char(VOUCHER_TIME,'yyyy-MM-dd') <![CDATA[>= ]]> to_char(#{jyzbLedger.voucherTimeTo},'yyyy-MM-dd')
</if>
<if test="jyzbLedger.voucherTimeFrom != null ">
and to_char(VOUCHER_TIME,'yyyy-MM-dd') <![CDATA[<= ]]> to_char(#{jyzbLedger.voucherTimeFrom},'yyyy-MM-dd')
</if>
MybatisPlus の時間範囲クエリ
上記を参照してください
2 つの mysql データベース
データベースの時刻タイプは DATE です
2. 入力パラメータはDate型の時刻データです。
- 入参
achievementDateStart: 2023-04-26
achievementDateStartEnd: 2023-05-19
- 受信パラメータの種類
/**
* 业绩时间-开始
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "业绩时间-开始")
private Date achievementDateStart;
/**
* 业绩时间-结束
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "业绩时间-结束")
private Date achievementDateStartEnd;
mybatisの処理時間範囲
date_format 日付型パラメータを指定された時刻型にフォーマットします。
<if test="oppConditionVO.achievementDateStart != null and oppConditionVO.achievementDateStartEnd != null">
and date_format( achievement_date, '%Y-%m-%d' )
BETWEEN date_format( #{oppConditionVO.achievementDateStart}, '%Y-%m-%d' )
and date_format( #{oppConditionVO.achievementDateStartEnd}, '%Y-%m-%d' )
</if>
MybatisPlus の時間範囲クエリ
queryWrapper.apply(oppConditionVO.getAchievementDateStart() != null,
"date_format (achievement_date,'%Y-%m-%d') >= date_format ({0},'%Y-%m-%d')", oppConditionVO.getAchievementDateStart())
.apply(oppConditionVO.getAchievementDateStartEnd() != null,
"date_format (achievement_date,'%Y-%m-%d') <= date_format ({0},'%Y-%m-%d')", oppConditionVO.getAchievementDateStartEnd());