sql语法 日期函数

📅 2026/7/14 17:01:45
sql语法 日期函数
TO_DATE,TO_CHAR,STR_TO_DATE, DATE_FORMAT操作OracleMySQL字符串 → 日期TO_DATE(2026-07-14, YYYY-MM-DD)STR_TO_DATE(2026-07-14, %Y-%m-%d)日期 → 字符串TO_CHAR(sysdate, YYYY-MM-DD)DATE_FORMAT(NOW(), %Y-%m-%d)格式符风格YYYY-MM-DD HH24:MI:SS%Y-%m-%d %H:%i:%sTO_DATESTR_TO_DATEDATE_FORMAT数据库OracleMySQLMySQL方向字符串 → 日期字符串 → 日期日期 → 字符串格式符YYYY-MM-DD%Y-%m-%d%Y-%m-%d对等关系Oracle 的解析函数MySQL 的解析函数等价于 TO_DATEMySQL 的格式化函数等价于 Oracle 的 TO_CHAR简单记Oracle 用 TO_DATE / TO_CHARMySQL 用 STR_TO_DATE / DATE_FORMAT功能一一对应只是函数名和格式符写法不同。 XML 语法规范在mybatis-plus的xml里写大于,小于等符号的时候需要转义字符含义XML 实体引用小于号lt;大于号gt;与符号amp;双引号quot;单引号apos;写法是否可行说明lt;✅ 推荐标准 XML 转义最常用gt;✅ 推荐同上![CDATA[ ]]✅ 可用适合大段 SQL减少转义直接写❌ 不可用XML 解析报错很多时候会看到 并没有转义确实很多 MyBatis 的 XML 文件中直接写 或 不会报错但 或 就会报错。原因在于 XML 的解析规则XML 解析器在读取内容时遇到 就会认为一个新标签要开始了所以它必须被转义。而 虽然理论上是标签结束符但 XML 解析器只有在匹配到对应的 之后才会把 当作标签结束来处理。单独出现的 通常不会引起解析错误。!-- ❌ 报错解析器看到 就懵了以为要开始新标签 --iftestage ! nullANDage#{age}/if!-- ❌ 同样报错 是罪魁祸首 --iftestage ! nullANDage#{age}/if!-- ✅ 不报错没有 解析器不会误解 --iftestage ! nullANDage#{age}/if!-- ✅ 不报错 中没有 所以安全 --iftestage ! nullANDage#{age}/ifTRUNC 截断TRUNC 是 Oracle 中非常常用的函数可以对日期和数字进行截断操作。日期将日期截断到指定的精度去掉时间部分或更粗粒度。TRUNC(date[,format])-- 去掉时分秒保留年月日最常用SELECTTRUNC(SYSDATE)FROMDUAL;-- 结果2026-07-14 00:00:00-- 截断到月保留年月日期变为1号SELECTTRUNC(SYSDATE,MM)FROMDUAL;-- 结果2026-07-01 00:00:00-- 截断到年保留年月日变为1月1号SELECTTRUNC(SYSDATE,YYYY)FROMDUAL;-- 结果2026-01-01 00:00:00-- 截断到小时去掉分钟和秒SELECTTRUNC(SYSDATE,HH24)FROMDUAL;-- 结果2026-07-14 11:00:00-- 截断到周返回本周第一天取决于 NLS 设置SELECTTRUNC(SYSDATE,DAY)FROMDUAL;format含义示例假设当前 2026-07-14 11:28:59不传截断到天2026-07-14 00:00:00YYYY截断到年2026-01-01 00:00:00MM截断到月2026-07-01 00:00:00DD截断到天2026-07-14 00:00:00HH24截断到小时2026-07-14 11:00:00MI截断到分钟2026-07-14 11:28:00DAY截断到周本周第一天 00:00:00-- 查询今天的所有记录忽略时间部分SELECT*FROMordersWHERETRUNC(order_date)TRUNC(SYSDATE);-- 查询本月的所有记录SELECT*FROMordersWHERETRUNC(order_date,MM)TRUNC(SYSDATE,MM);-- 查询某天的数据忽略时间SELECT*FROMordersWHERETRUNC(order_date)TO_DATE(2026-07-14,YYYY-MM-DD);TRUNC(数字)TRUNC(number, decimal_places)number要截断的数字decimal_places可选保留的小数位数。不传默认为 0SELECTTRUNC(123.4567)FROMDUAL;-- 结果123SELECTTRUNC(123.4567,0)FROMDUAL;-- 结果123SELECTTRUNC(123.4567,1)FROMDUAL;-- 结果123.4SELECTTRUNC(123.4567,2)FROMDUAL;-- 结果123.45SELECTTRUNC(123.4567,-1)FROMDUAL;-- 结果120截断到十位SELECTTRUNC(123.4567,-2)FROMDUAL;-- 结果100截断到百位TRUNC(日期)TRUNC(数字)数据库OracleOracle作用截断日期到指定精度截断数字到指定小数位是否四舍五入不涉及❌ 不四舍五入直接截断MySQL 对应DATE()TRUNCATE()常见用途去掉时间部分按天/月/年分组保留指定位数小数不做四舍五入TRUNC能传字符串日期么?Oracle 会尝试将字符串隐式转换为 DATE 类型风险隐式转换依赖数据库会话的 NLS_DATE_FORMAT 设置。如果格式不匹配会报错ORA-01843: not a valid month推荐显示转换-- 推荐写法SELECTTRUNC(TO_DATE(2026-07-14,YYYY-MM-DD))FROMDUAL;-- 结果2026-07-14 00:00:00-- 带时间的字符串SELECTTRUNC(TO_DATE(2026-07-14 15:30:45,YYYY-MM-DD HH24:MI:SS))FROMDUAL;-- 结果2026-07-14 00:00:00与其他数据库的对应关系操作OracleMySQL日期截断到天TRUNC(date)DATE(date)或DATE_FORMAT(date, %Y-%m-%d)数字截断TRUNC(num, n)TRUNCATE(num, n)数字四舍五入ROUND(num, n)ROUND(num, n)