SELECT
EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')) AS year
FROM
dual;
SELECT
EXTRACT(MONTH FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')) AS month
FROM
dual;
SELECT
ADD_MONTHS(TRUNC(TO_DATE('2023-11-02', 'yyyy-MM-dd')), -12) AS last_date
FROM
dual;
1、使用 EXTRACT 函数从日期字符串 ‘2023-11-15’ 中提取年份;
2、TO_DATE(‘2023-11-02’, ‘YYYY-MM-DD’) 将日期字符串转换为日期格式;
3、TO_CHAR(…, ‘YYYY’) 将日期转换为字符串;
4、 TO_NUMBER 将字符串转换为数字;
5、MOD 函数用于计算年份除以 4 的余数,如果余数为 0,则该年为闰年,返回 366 天;否则返回 365 天。
SELECT
CASE
WHEN (MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),4) = 0
AND MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),100) != 0)
OR MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),400) = 0
THEN 366
ELSE 365
END AS days
FROM
dual;
TRUNC(your_date, ‘YYYY’)用于将日期截断为年初。然后,通过从日期列中减去年初的日期来计算到年初的天数。天数需要加1。
SELECT
TO_DATE('2023-01-02', 'yyyy-MM-dd') - trunc( TO_DATE('2023-01-02', 'yyyy-MM-dd'), 'yyyy') + 1 AS days
FROM
dual;
CASE
WHEN amt = 0 THEN NULL
-- 或者其他处理方式,比如返回 NULL
ELSE ROUND(pay_amt / amt, 4)* 100
END AS ratio
对于除法运算,要判断除数是否为0
,当除数为 NULL时
,计算结果通常也是 NULL
。
用于层次结构的数据,比如组织架构、地区划分等。
SELECT
*
FROM
relationship a
START WITH
a.parent_code = '0'
CONNECT BY
PRIOR a.code = a.parent_code;
connect by prior
条件递归地沿着自连接关系遍历子集;START WITH
子句指定了起始条件,这里是从 parent_code='0'
的记录开始;CONNECT BY PRIOR
子句用于指定递归条件,a.code = a.parent_code
表示每次迭代都会沿着 code 和 parent_code 相等的路径向下查找;REPLACE 函数会将原始日期中的年份部分替换为另一个字段的年份部分。确保替换后的格式与原始日期相匹配。
--original_date 是原始日期字段。
--another_date 是作为替换参考的日期字段。
--desired_date 是想要替换成的日期字段。
SELECT
REPLACE(TO_CHAR(original_date, 'YYYY-MM-DD'), TO_CHAR(another_date, 'YYYY'), TO_CHAR(desired_date, 'YYYY')) AS replaced_date
FROM your_table;
DECODE 函数是 Oracle 提供的一种条件表达式函数,用于根据指定条件返回不同的结果。
DECODE(expression, search1, result1, search2, result2, ..., default_result)
decode(i2.incom_year_amt,0,null,ROUND((i1.incom_year_amt-i2.incom_year_amt)/ i2.incom_year_amt, 4)* 100) AS incratio
SELECT
sum(amt) AS all_amt
FROM your_table group by mof_div_code,report_date;
语法:
<窗口函数>(列) OVER (
PARTITION BY 分区字段
ORDER BY 排序字段
ROWS/RANGE 子句
)
为结果集中的每一行分配一个唯一的数字,通常用于排序后按顺序编号。
SELECT
column1,
column2,
ROW_NUMBER() OVER (ORDER BY column1) AS row_num
FROM
your_table;
为结果集中的每一行分配一个排名,如果有相同值,则排名相同,下一个排名按照次序递增。
SELECT
RANK() OVER (ORDER BY column_name) AS rank_value,
column_name
FROM table_name;
LEAD() 和 LAG():分别用于获取当前行后面和前面的行的值。
SELECT
RANK() OVER (ORDER BY column_name) AS rank_value,
column_name
FROM table_name;
用于计算指定列的总和,结合窗口函数使用时可计算分组内的累计总和。比如需要统计某一年到指定日期的汇总金额。
SELECT
column_name,
SUM(column_name) OVER (PARTITION BY group_column ORDER BY order_column) AS running_total
FROM table_name;
SUM(INCOM_DAY_AMT) OVER (PARTITION BY FISCAL_YEAR ORDER BY MOF_DIV_CODE,FUND_TYPE_CODE,REPORT_DATE) AS cur_day_total
对每年的数据进行分组
,并按照给定的顺序计算每个分组内的累计金额
,结果将返回每一行数据所在年度的累计金额
。SUM(INCOM_DAY_AMT) OVER (PARTITION BY EXTRACT(YEAR FROM ADD_MONTHS(TRUNC(REPORT_DATE), -12)) ORDER BY MOF_DIV_CODE,FUND_TYPE_CODE,ADD_MONTHS(TRUNC(REPORT_DATE), -12)) AS pre_year_to_date_total
PIVOT 是 SQL 中的一种操作,它用于将行数据转换为列数据,可以进行数据透视(pivot)操作。PIVOT 操作常用于聚合和重新排列数据,将行转换为列以更直观地展示汇总信息。
SELECT *
FROM (
-- 原始查询,生成需要透视的数据
-- 包含需要进行透视操作的字段
)
PIVOT (
-- 聚合函数和要透视的字段
AGGREGATE_FUNCTION(column_name)
FOR pivot_column IN (value1 AS alias1, value2 AS alias2, ..., valueN AS aliasN)
)
举例:
SELECT *
FROM (
SELECT department, employee_name, salary
FROM employee_salary
)
PIVOT (
SUM(salary)
FOR department IN ('HR' AS hr_salary, 'IT' AS it_salary, 'Finance' AS finance_salary)
)
将 employee_salary 表按照部门进行透视
,生成新的列 ‘HR’ AS hr_salary, ‘IT’ AS it_salary, ‘Finance’ AS finance_salary,每列包含相应部门的薪资总和
。
UPDATE tablename
SET CL_CUR_AMT = CL_CUR_AMT - FLOOR(DBMS_RANDOM.VALUE(100000000, 500000000)) where REPORT_DATE = TO_DATE('2022-12-03','yyyy-MM-dd') ;
SUBSTR 函数结合 CONCAT 或 || 运算符来替换一个字段的前两位。
--CONCAT
UPDATE FM_LEDGER_AGENCY set MOF_DIV_CODE = CONCAT('21', SUBSTR(MOF_DIV_CODE , 3)) ;
-- || 运算符
SELECT 'new' || SUBSTR(old_field, 3) AS replaced_field
FROM your_table;
LISTAGG 函数用于将多行数据聚合成一个以指定分隔符分隔的字符串。它通常与 GROUP BY 子句一起使用,用于对分组内的数据进行字符串连接。
SELECT
LISTAGG(sub_mof_div_code, ',') WITHIN GROUP (ORDER BY sub_mof_div_code) AS name_list
from GAP_MOF_DIV_RELATION group by mof_div_code
这个查询的结果将返回一个名为 name_list 的列
,其中包含了按照每个 mof_div_code 分组的所有 sub_mof_div_code 值
,以逗号分隔,并按照 sub_mof_div_code 进行排序后的字符串。
select * from (select * from GAP_MENU as of timestamp to_timestamp('2023-08-17 19:50:00','YYYY-MM-DD HH24:MI:SS'))where NAME in ('三保预警管理','三保运行监测','三保风险管控','三保配置管理');
alter table GAP_MENU enable row movement;
flashback table GAP_MENU to scn timestamp_to_scn (to_date('2023-08-17 19:50:00','yyyy-mm-dd hh24:mi:ss'));
alter table GAP_MENU enable row movement;
DBLink 提供了一种方式来执行跨数据库的查询和操作。
--remote_db 链接指定的名称
--remote_user、remote_password是远程数据库的用户名和密码
--remote_db_host 主机
--remote_db_service 服务名
create public database link remote_db
connect to remote_user identified by remote_password
using
'(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =remote_db_host)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = remote_db_service))
)';
SELECT * FROM table_name@remote_db;
INSERT INTO remote_table@remote_db (column1, column2) VALUES (value1, value2);
DROP DATABASE LINK remote_db;
GRANT CREATE DATABASE LINK TO your_user;
SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE = 'CREATE DATABASE LINK' AND GRANTEE = 'your_user';