Oracle 数据库提供了丰富的时间日期处理功能,以下是一些常用的时间查询语句和技巧:
当前时间查询
SELECT SYSDATE FROM dual; -- 系统当前日期和时间
SELECT CURRENT_DATE FROM dual; -- 会话时区的当前日期
SELECT CURRENT_TIMESTAMP FROM dual; -- 会话时区的当前时间戳
日期格式化
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
-- 输出格式:2023-11-15 14:30:45
日期加减
-- 加1天
SELECT SYSDATE + 1 FROM dual;
-- 加1小时
SELECT SYSDATE + 1/24 FROM dual;
-- 加1分钟
SELECT SYSDATE + 1/1440 FROM dual;
日期差计算
-- 计算两个日期之间的天数差
SELECT (end_date - start_date) AS days_diff FROM your_table;
-- 使用MONTHS_BETWEEN计算月数差
SELECT MONTHS_BETWEEN(end_date, start_date) FROM your_table;
EXTRACT 函数
SELECT EXTRACT(YEAR FROM SYSDATE) FROM dual; -- 提取年份
SELECT EXTRACT(MONTH FROM SYSDATE) FROM dual; -- 提取月份
SELECT EXTRACT(DAY FROM SYSDATE) FROM dual; -- 提取日
TRUNC 函数
SELECT TRUNC(SYSDATE) FROM dual; -- 截断到当天00:00:00
SELECT TRUNC(SYSDATE, 'MM') FROM dual; -- 截断到当月第一天
SELECT TRUNC(SYSDATE, 'YYYY') FROM dual; -- 截断到当年第一天
LAST_DAY 函数
SELECT LAST_DAY(SYSDATE) FROM dual; -- 获取当月最后一天
查询今天的数据
SELECT * FROM your_table
WHERE TRUNC(date_column) = TRUNC(SYSDATE);
查询本月的数据
SELECT * FROM your_table
WHERE TRUNC(date_column, 'MM') = TRUNC(SYSDATE, 'MM');
查询过去30天的数据
SELECT * FROM your_table
WHERE date_column >= SYSDATE - 30;
查询特定时间段的数据
SELECT * FROM your_table
WHERE date_column BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD')
AND TO_DATE('2023-01-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS');
-- 转换时区
SELECT FROM_TZ(CAST(SYSDATE AS TIMESTAMP), 'UTC') AT TIME ZONE 'America/New_York'
FROM dual;
-- 获取时区列表
SELECT * FROM V$TIMEZONE_NAMES;
对日期列使用函数会阻止索引使用,如:
-- 不推荐(无法使用索引)
SELECT * FROM table WHERE TO_CHAR(date_col, 'YYYY-MM-DD') = '2023-01-01';
-- 推荐(可以使用索引)
SELECT * FROM table WHERE date_col BETWEEN TO_DATE('2023-01-01', 'YYYY-MM-DD')
AND TO_DATE('2023-01-01 23:59:59', 'YYYY-MM-DD HH24:MI:SS');
考虑对频繁查询的日期列创建函数索引:
CREATE INDEX idx_trunc_date ON your_table(TRUNC(date_column));
希望这些Oracle时间查询语句对您有所帮助!如需更具体的查询示例,请提供您的具体需求。