SQL格式化(字符串,时间,数字之间的相互转化)
SQL常用格式转化方法
目录
1. 数字格式转化
千分位数字格式化(保留两位小数)
Oracle
SELECT TO_CHAR(12345.3, 'FM999,999,999,999,990.00') AS formatted_num FROM dual;
FM:防止前导空格0.00:保证小数点后两位
MySQL
SELECT FORMAT(12345.3, 2) AS formatted_num;
Hive/Impala
Hive/Impala没有内置千分位格式化函数,可用printf或自定义UDF:
SELECT printf('%,.2f', 12345.3); -- 输出: 12,345.30 -- 支持hive查询
SELECT format_number(12345.3, 2); -- 输出: 12,345.30 -- 支持hive查询,impala可能得看版本支持
2. 时间格式转化
2.1 字符串转时间
| 目标 | Oracle | Hive/Impala | MySQL |
|---|---|---|---|
| 例:'20250101'转日期 | TO_DATE('20250101', 'YYYYMMDD') | from_unixtime(unix_timestamp('20250101', 'yyyyMMdd'),'yyyy-MM-dd') | STR_TO_DATE('20250101', '%Y%m%d') |
示例:
- Oracle:
SELECT TO_DATE('20250101', 'YYYYMMDD') AS dt FROM dual; - Hive/Impala:
SELECT from_unixtime( unix_timestamp('20250101', 'yyyyMMdd'), 'yyyy-MM-dd' ) AS dt - MySQL:
SELECT STR_TO_DATE('20250101', '%Y%m%d') AS dt;
2.2 时间转字符串
| 目标 | Oracle | Hive/Impala | MySQL |
|---|---|---|---|
| 日期转'2025-01-01' | TO_CHAR(sysdate, 'YYYY-MM-DD') | date_format(current_date, 'yyyy-MM-dd') | DATE_FORMAT(NOW(), '%Y-%m-%d') |
示例:
- Oracle:
SELECT TO_CHAR(sysdate, 'YYYY-MM-DD') AS str FROM dual; - Hive/Impala:
SELECT date_format(current_date, 'yyyy-MM-dd') AS str; - MySQL:
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS str;
2.3 时间戳数字转时间
| 目标 | Oracle | Hive/Impala | MySQL |
|---|---|---|---|
| 例:数字时间戳转日期 | FROM_UNIXTIME(1704067200, 'yyyy-MM-dd') | from_unixtime(1704067200, 'yyyy-MM-dd') | FROM_UNIXTIME(1704067200, '%Y-%m-%d') |
示例:
- Oracle(需先转秒数):
SELECT TO_DATE('1970-01-01','YYYY-MM-DD') + NUMTODSINTERVAL(1704067200, 'SECOND') AS dt FROM dual; - Hive/Impala:
SELECT from_unixtime(1704067200, 'yyyy-MM-dd') AS dt; - MySQL:
SELECT FROM_UNIXTIME(1704067200, '%Y-%m-%d') AS dt;
2.4 时间转数字(时间戳)
| 目标 | Oracle | Hive/Impala | MySQL |
|---|---|---|---|
| 日期转UNIX时间戳 | (date - TO_DATE('1970-01-01','YYYY-MM-DD'))*86400 | unix_timestamp(date) | UNIX_TIMESTAMP(date) |
示例:
- Oracle:
SELECT (TO_DATE('2025-01-01','YYYY-MM-DD') - TO_DATE('1970-01-01','YYYY-MM-DD'))*86400 AS ts FROM dual; - Hive/Impala:
SELECT unix_timestamp('2025-01-01', 'yyyy-MM-dd') AS ts; - MySQL:
SELECT UNIX_TIMESTAMP('2025-01-01') AS ts;
3. 其他说明
- SQL的主要功能是数据查询和分析,格式转化建议适度使用。
- 对于复杂的格式化需求,建议在应用层或报表工具中处理。
4. FR格式转化方法
FR自带一些格式转化方法,如在javascript中:
FR.contentFormat(表达式, '#,##0.00')
自带的公式
format(表达式, '#,##0.00')


浙公网安备 33010602011771号