Oracle中日期的声明与设置:SQL Server写法如何迁移?
在Oracle中实现SQL Server的日期查询操作
嘿,我来帮你把SQL Server里的日期查询转换成Oracle的写法~ 先整理了几种最常见的场景,对应Oracle的实现方式:
1. 直接声明日期常量
SQL Server常用写法:
-- 直接用字符串(依赖会话日期格式设置) SELECT * FROM your_table WHERE date_col = '2023-10-01'; -- 显式转换为DATE类型 SELECT * FROM your_table WHERE date_col = CAST('2023-10-01' AS DATE); SELECT * FROM your_table WHERE date_col = CONVERT(DATE, '2023-10-01');
Oracle对应实现:
Oracle里推荐用**TO_DATE()函数**显式指定格式转换,避免依赖会话的NLS_DATE_FORMAT参数,稳定性更强:
-- 显式格式转换(最推荐) SELECT * FROM your_table WHERE date_col = TO_DATE('2023-10-01', 'YYYY-MM-DD'); -- Oracle 12c+支持的标准日期字面量写法(类似SQL Server隐式转换,但仍建议显式) SELECT * FROM your_table WHERE date_col = DATE '2023-10-01';
2. 获取当前日期/时间
SQL Server常用写法:
-- 当前日期(不含时间部分) SELECT CAST(GETDATE() AS DATE); -- 当前日期时间 SELECT GETDATE(); SELECT SYSDATETIME(); -- 更高精度的时间
Oracle对应实现:
-- 当前日期(不含时间) SELECT TRUNC(SYSDATE) FROM DUAL; -- 当前日期时间 SELECT SYSDATE FROM DUAL; -- 更高精度的当前时间 SELECT SYSTIMESTAMP FROM DUAL;
3. 日期加减操作
SQL Server常用写法:
-- 加1天 SELECT DATEADD(DAY, 1, GETDATE()); -- 减1个月 SELECT DATEADD(MONTH, -1, GETDATE());
Oracle对应实现:
Oracle支持直接对日期做算术运算,月份加减建议用专门的ADD_MONTHS()函数:
-- 加1天 SELECT SYSDATE + 1 FROM DUAL; -- 减1个月 SELECT ADD_MONTHS(SYSDATE, -1) FROM DUAL; -- 加1小时 SELECT SYSDATE + 1/24 FROM DUAL;
4. 提取日期的部分字段
SQL Server常用写法:
-- 提取年份 SELECT YEAR(GETDATE()); -- 提取月份 SELECT MONTH(GETDATE()); -- 提取日 SELECT DAY(GETDATE());
Oracle对应实现:
可以用EXTRACT()函数直接提取,或者TO_CHAR()格式化提取:
-- 提取年份 SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; -- 提取月份 SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL; -- 提取日 SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL; -- 用TO_CHAR格式化提取(适合需要字符串结果的场景) SELECT TO_CHAR(SYSDATE, 'YYYY') AS year, TO_CHAR(SYSDATE, 'MM') AS month FROM DUAL;
如果你有特定的SQL Server日期查询语句,随时贴出来,我帮你精准转换~
内容的提问来源于stack exchange,提问作者Ray J




