mysql与oracle日期格式化字符对照表

本文对比了MySQL与Oracle数据库中日期格式化的字符,便于开发者快速查阅和转换。包括年、月、日、时、分、秒等常见格式。

mysql与oracle日期格式化字符对照表

oracle 与mysql数据库都提供较强大的日期格式化格式,本文把两种数据库的格式化字符做一个对比,供大家参考:

常用格式串
mysql: DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s')

oracle:TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')

以下是格式字符详细列表,空白表示没有对应的格式:

mysql

oracle

说明

%a

Dy
DY
dy

工作日的缩写名称 (Sun..Sat)

%b

Mon
MON
mon

月份的缩写名称(Jan..Dec)

%c

MM

月份,数字形式(0..12)

%D

带有英语后缀的该月日期(0th,1st,2nd,3rd, ...)

%d

DD

该月日期,数字形式(00..31)

%e

该月日期,数字形式(0..31)

%f

FF[6]

微秒(000000..999999)

%H

HH24

小时(00..23)

%h

@I

HH

小时(01..12)

%i

MI

分钟,数字形式(00..59)

%j

DDD

一年中的天数(001..366)

%k

小时(0..23)

%l

小时(1..12)

%M

Month
MONTH
month

月份名称(January..December)

%m

MM

月份,数字形式(00..12)

%p

AM
PM

上午(AM)或下午(PM)

%r

时间, 12小时制(小时hh:分钟mm:秒数ss后加AM或PM)

%S

SS

秒(00..59)

%s

SS

秒(00..59)

%T

时间, 24小时制(小时hh:分钟mm:秒数ss)

%U

周(00..53),其中周日为每周的第一天

%u

周(00..53),其中周一为每周的第一天

%V

周(01..53),其中周日为每周的第一天;和%X同时使用

%v

周(01..53),其中周一为每周的第一天;和%x同时使用

%W

工作日名称(周日..周六)

%w

D

一周中的每日(0=周日..6=周六)

%X

该周的年份,其中周日为每周的第一天,数字形式,4位数;和%V同时使用

%x

该周的年份,其中周一为每周的第一天,数字形式,4位数;和%v同时使用

%Y

YYYY

年份,数字形式,4位数

%y

YY

年份,数字形式(2位数)

%%

‘%’文字字符

SSSSS

一天以来经过的秒数(0-86399)

Q

季度(1,2,3,4)

RM
rm
Rm

罗马数字月份 (I-XII; JAN = I)

WW

周(01..52),从1月1号开始计算

IW

周(00..53),从第一个周一开始计算,之前计为上年第52周

W

月份中的周(1-5),从每月1号开始计算

FF[1..9]

微秒,后面的数字表示显示位数

我的新浪微博: http://weibo.com/yzsind

<think>好的,用户需要将MySQL的SQL语句转换为Oracle兼容的。首先,我得回顾一下之前提供的引用内容,看看有哪些关键点可以利用。引用[1]提到用户开发了一个在线工具,支持不同数据库的SQL转换,这可能是一个快速解决方案。但用户可能希望手动调整,所以需要具体的方法。 接下来,引用[2]和[3]提供了具体的转换示例和优化建议。例如,日期函数的不同,MySQL用NOW(),而Oracle用SYSDATE。还有分页查询的区别,MySQL用LIMIT,Oracle用ROWNUM或FETCH。这些都是常见的转换点。 然后,我需要考虑用户可能遇到的常见问题。比如数据类型的不同,比如MySQL的DATETIME对应Oracle的DATE,自增字段的处理(Oracle用序列和触发器),以及字符串连接函数的不同(CONCAT vs ||)。这些都是转换中需要特别注意的地方。 另外,用户可能不知道如何处理特定的函数或语法结构,比如自动提交设置或者索引的创建。需要提醒他们Oracle不支持AUTO_INCREMENT,必须手动创建序列和触发器。还有隐式转换的问题,Oracle更严格,需要显式转换数据类型。 最后,应该提供一些优化建议,比如索引的使用和避免不必要的排序,这些在Oracle中同样重要。同时,推荐使用在线工具快速转换,但也要注意检查结果,因为工具可能不完美。测试是关键,特别是在迁移后需要验证所有功能是否正常。</think>将MySQL SQL语句转换为Oracle SQL需要重点关注语法差异、函数替换和特性适配。以下是关键转换步骤及示例: ### 一、基础语法转换 1. **分页查询转换** MySQL:`LIMIT` ```sql SELECT * FROM orders LIMIT 10,20 ``` Oracle:使用三层嵌套查询 ```sql SELECT * FROM ( SELECT t.*, ROWNUM rn FROM ( SELECT * FROM orders ORDER BY order_id ) t WHERE ROWNUM <= 30 ) WHERE rn > 20 ``` 2. **日期函数转换** MySQL:`NOW()` ```sql SELECT NOW() ``` Oracle:`SYSDATE` ```sql SELECT SYSDATE FROM DUAL ``` ### 二、数据类型转换 | MySQL类型 | Oracle对应类型 | |----------------|-----------------| | DATETIME | DATE | | TINYINT(1) | NUMBER(1) | | AUTO_INCREMENT | 序列+触发器 |[^3] **示例:自增字段转换** MySQL: ```sql CREATE TABLE users( id INT AUTO_INCREMENT PRIMARY KEY ) ``` Oracle: ```sql CREATE SEQUENCE users_seq; CREATE TABLE users( id NUMBER PRIMARY KEY ); CREATE TRIGGER users_trigger BEFORE INSERT ON users FOR EACH ROW BEGIN SELECT users_seq.NEXTVAL INTO :new.id FROM DUAL; END; ``` ### 三、函数替换对照 | 功能 | MySQL函数 | Oracle函数 | |-------------|---------------|-----------------| | 字符串连接 | CONCAT() | \|\| 运算符 | | 当前时间 | NOW() | SYSDATE | | 日期格式化 | DATE_FORMAT() | TO_CHAR() | | 空值处理 | IFNULL() | NVL() | **示例:日期格式化转换** MySQL: ```sql SELECT DATE_FORMAT(create_time,'%Y-%m') FROM orders ``` Oracle: ```sql SELECT TO_CHAR(create_time,'yyyy-mm') FROM orders ``` ### 四、特殊处理场景 1. **隐式类型转换** Oracle对类型匹配更严格,需显式转换: ```sql -- MySQL SELECT '100' + 50 -- Oracle SELECT TO_NUMBER('100') + 50 FROM DUAL ``` 2. **事务控制** Oracle默认关闭自动提交,需显式提交: ```sql COMMIT; ``` 3. **存储过程差异** Oracle使用PL/SQL语法,需重写变量声明和流程控制语句 ### 五、转换工具推荐 1. 使用在线转换工具进行基础转换[^1] 2. 通过MyBatis类型处理器处理方言差异[^2] 3. 对转换结果进行以下验证: - 执行计划分析 - 结果集一致性测试 - 性能基准测试 ### 六、优化建议 1. 为WHERE条件字段创建索引[^3] 2. 避免使用`SELECT *`,明确字段列表 3. 将小表放在连接条件右侧[^3] 4. 使用`UNION ALL`替代`UNION`(去除非必要去重)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值