测试环境:
- Vertica: Vertica Analytic Database v11.1.1-22
- WutongDB: V5.4.10.0
1. add_months
功能说明:
add_months(date, integer)
函数用于将指定的月份数加到给定的日期上,返回一个新的日期。这在日期计算中非常有用,尤其是需要计算从某个日期起几个月后的日期。测试语句:
select to_char( add_months(to_date('202403', 'yyyymm'), -12), 'yyyymm' );
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
202303
WutongDB 输出结果:
在梧桐数据库在显示无此函数,如下图所示:
function add_months(date, date) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
Wutong DB 5.4 和 Wutong DB 6 都不提供
add_months
函数,可以使用以下方法:SELECT date '2024-03-01' + INTERVAL 'n months';
函数说明:
INTERVAL 'n months'
:在日期上加上或减去指定的月份数。
2. age_in_months
功能说明:
age_in_months(date1, date2)
函数用于计算两个日期之间的月份差异。该函数通常用于计算日期跨度,以月为单位。测试语句:
select a.*, b.sett_money, case when age_in_months(date('now'), date(expire_date)) > 0 then age_in_months(date('now'), date(expire_date)) * 10.00 else null end from gs_test.test_function_add_months01 a left join ( select distinct serv_number, channel_id, offer_id, sett_money from gs_test.test_function_add_months02 ) b on a.serv_number = b.serv_number and a.create_org_id = b.channel_id and a.offer_id = b.offer_id order by serv_number, user_id, offer_ins_id, offer_id;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库在显示无此函数,如下所示:
function age_in_months(date, date) does not exist
Wutong DB 5.4 替代方案:
在 Wutong DB 5.4 中,可以使用
AGE()
函数来计算日期之间的差异,返回以年和月为单位的时间差:SELECT EXTRACT(YEAR FROM AGE(date1, date2)) * 12 + EXTRACT(MONTH FROM AGE(date1, date2));
Wutong DB 6 替代方案:
Wutong DB 6 同样可以使用
AGE()
函数:SELECT EXTRACT(YEAR FROM AGE(date)) AS years;
3. age_in_years
功能说明:
age_in_years(date)
函数用于计算从指定日期到当前日期之间的年数。该函数通常用于计算年龄。测试语句:
select age_in_years('1939-11-21'::DATE);
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
84
WutongDB 输出结果:
在梧桐数据库在显示无此函数,如下所示:
function age_in_years(date) does not exist
Wutong DB 替代方案:
- 请参考
age_in_months
的解决替代方案
- 请参考
4. clock_timestamp
功能说明:
clock_timestamp()
函数返回当前的日期和时间,包括时区。与current_timestamp
不同的是,clock_timestamp
每次调用时都会返回不同的值,即使在同一个查询中。测试语句:
select clock_timestamp() "current time";
Vertica 输出结果:
输出结果如下所示:
2024/6/17 17:35:25
WutongDB 输出结果:
在梧桐数据库输出如下所示:(与 Vertica 的展示格式不同)
2024-06-17 17:35:34.900274+08:00
5. current_date
功能说明:
current_date
函数返回当前的日期(不包括时间部分)。这是获取当前日期的快捷方式。测试语句:
select distinct user_id, serv_number from gs_test.test_function_current_date where user_status in ('1', '2', '3', '6') --and current_date()-join_date <= 180 -- 近 6 个月 order by user_id, serv_number;
Vertica 输出结果:
在 vertica 中可以执行,如下图所示:
WutongDB 输出结果:
在梧桐数据库输出显示错误,如下所示:
syntax error at or near "(" ----------------------------------------------------------------- -- 单独执行 select current_date(); 报错: syntax error at or near "(" -- 去掉括号可以正常执行
6. current_time
功能说明:
current_time(precision)
函数返回当前时间,精度由参数指定。它不包括日期部分。测试语句:
select current_time(1);
Vertica 输出结果:
在 vertica 中可以执行,如下图所示:
17:37:38
WutongDB 输出结果:
在梧桐数据库输出如下所示:(与 Vertica 显示格式不同)
17:37:35.9+08:00
7. current_timestmp
功能说明:
current_timestamp(precision)
函数返回当前的日期和时间,精度由参数指定。它包括时区信息。测试语句:
select current_timestamp(1);
Vertica 输出结果:
在 vertica 中可以执行,如下图所示:
2024-06-17 17:38:55.900
WutongDB 输出结果:
在梧桐数据库输出如下所示:(与 Vertica 显示格式不同)
2024-06-17 17:39:23.6+08:00
8. date_part
功能说明:
date_part(field, source)
函数用于从日期或时间戳中提取指定的部分(如年、月、日、小时等)。这是日期和时间操作中非常常用的函数。测试语句:
select a.*, row_number() over ( partition by imei order by cur_gprs_gb desc ) rn -- 给终端按当月使用流量(由高到低)排序 from gs_test.test_function_date_part a where cur_gprs_gb >= round(16.7 * date_part('day', date(to_char(20240617))), 1) and a.statis_month = 202405;
Vertica 输出结果:
在 vertica 中可以执行,如下图所示:
WutongDB 输出结果:
在梧桐数据库在显示无此函数,如下图所示:
pq: function round(double precision, integer) does not exist
CREATE TABLE bdtmp.tb_tmp_user_traffic_anomaly_detection_model_tmp05 ( statis_month bigint, serv_number varchar(20), imei varchar(20), cur_gprs_gb numeric(72,54) ); -- 在梧桐数据库建表失败,报错: pq: ORC DECIMAL precision must be between 1 and 38 -- 另一种测试 select date_part('dow',current_date); 输出结果一致
9. date
功能说明:
date(expression)
函数用于将表达式转换为日期类型。它通常用于格式转换,确保数据类型一致性。测试语句:
select case when a.up_area_code is null then '999' else a.up_area_code end, nvl(count(case when a.join_date>=(date(sysdate)-1) then a.user_id else null end),0), nvl(count(case when to_number(substr(to_char(a.join_date,'yyyymmdd'),1,6))>=to_number(substr(to_char(date(sysdate),'yyyymmdd'),1,6)) then a.user_id else null end),0), nvl(count(case when a.join_date>='2020-12-01' then a.user_id else null end),0) from gs_test.test_function_date a where data_flux>0 -- 剔除流量不活跃用户 group by rollup(a.up_area_code) order by a.up_area_code ;
Vertica 输出结果:
在 vertica 中可以执行,如下图所示:
WutongDB 输出结果:
在梧桐数据库在显示无此函数,如下图所示:
column "sysdate" does not exist
将 sysdate 改为 sysdate()后输出结果与 vertica 数据库输出结果一致
Wutong DB 5.4 替代方案:
- 使用
CAST
或::
操作符将字符串或其他表达式转换为日期:
SELECT CAST(expression AS DATE); -- 或者 SELECT expression::DATE;
- 使用
Wutong DB 6 替代方案:
- Wutong DB 6 版本同样支持
CAST
和::
操作符转换数据类型:
SELECT CAST(expression AS DATE); -- 或者 SELECT expression::DATE;
- Wutong DB 6 版本同样支持
10. date_trunc
功能说明:
date_trunc(field, source)
函数用于截断日期或时间戳,保留指定的时间单位(如年、月、日等)。它通常用于将日期精确到某个单位。测试语句:
select a.*, datediff( month, to_date(bill_month, 'yyyymmdd'), date(date_trunc('month', sysdate)) ) month_diff --min(bill_month) 与当前月的时间差 from gs_test.test_function_date_trunc a;
Vertica 输出结果:
在 vertica 中可以执行,如下图所示:
WutongDB 输出结果:
在梧桐数据库在显示无此函数,如下图所示:
column "month" does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
Wutong DB 5.4 和 Wutong DB 6 都支持
date_trunc()
函数:SELECT date_trunc('month', timestamp '2024-07-13 10:30:00');
函数说明:
date_trunc(field, source)
:截断时间戳,保留到指定的field
精度(如年、月、日等)。
11. datediff
功能说明:
datediff(unit, date1, date2)
函数用于计算两个日期之间的差异,并以指定的单位(如天、月、年等)返回结果。测试语句:
select a.offer_name, sum(datediff(second, create_date, done_date)) / count(1) as order_time from gs_test.test_function_datediff01 a, gs_test.test_function_datediff02 b where --a.order_id = b.order_id and b.busi_code = 'ecCrt' and b.data_status = '1' group by a.offer_name;
Vertica 输出结果:
在 vertica 中可以执行,如下图所示:
WutongDB 输出结果:
在梧桐数据库在显示无此函数,如下图所示:
column "second" does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
- Wutong DB 不直接提供
datediff
函数,但可以通过使用AGE()
函数或EXTRACT()
函数结合日期的相减操作来实现。
- Wutong DB 不直接提供
- **计算天数差异**:
- 使用日期相减直接返回两个日期之间的天数差异:
```sql
SELECT date1 - date2;
```
- **计算年、月差异:**
- 使用 `AGE()` 函数来返回年、月差异:
```sql
SELECT AGE(date1, date2);
```
- **如果需要获取更精确的天、月、年差异,可以结合 `EXTRACT` 函数来处理特定的时间单位:**
```sql
-- 计算年份差异
SELECT EXTRACT(YEAR FROM AGE(date1, date2));
-- 计算月份差异
SELECT EXTRACT(MONTH FROM AGE(date1, date2));
-- 计算天数差异
SELECT EXTRACT(DAY FROM AGE(date1, date2));
```
- **自定义日期差异(如小时、分钟、秒):**
- 使用 `EXTRACT` 函数计算自定义单位的差异:
```sql
-- 计算小时差异
SELECT EXTRACT(EPOCH FROM (date1 - date2)) / 3600;
-- 计算分钟差异
SELECT EXTRACT(EPOCH FROM (date1 - date2)) / 60;
-- 计算秒数差异
SELECT EXTRACT(EPOCH FROM (date1 - date2));
```
12. day
功能说明:
day(date)
函数用于返回日期中的“日”部分。该函数常用于从完整的日期中提取日信息。测试语句:
select day(timestamp 'sep 22,2011 12:34');
Vertica 输出结果:
在 vertica 中可以执行,如下所示:
22
WutongDB 输出结果:
在梧桐数据库显示如下所示:
22
13. dayofmonth
功能说明:
dayofmonth(date)
函数返回指定日期中的“日”部分,与day
函数功能相同。测试语句:
select dayofmonth(date(to_char(20240618)));
Vertica 输出结果:
在 vertica 中可以执行,如下所示:
18
WutongDB 输出结果:
在梧桐数据库显示找不到该函数 ,如下所示:
function dayofmonth(date) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
- 使用
EXTRACT
函数:
SELECT EXTRACT(DAY FROM date);
- 使用
14. dayofweek
功能说明:
dayofweek(date)
函数返回指定日期对应的星期几, 1 表示星期日, 7 表示星期六。它常用于确定日期对应的星期几。测试语句:
select case when dayofweek(date('20240618'))=1 then date('20240618')-6 when dayofweek(date('20240618'))=2 then date('20240618')-5 when dayofweek(date('20240618'))=3 then date('20240618')-4 when dayofweek(date('20240618'))=4 then date('20240618')-3 when dayofweek(date('20240618'))=5 then date('20240618')-2 when dayofweek(date('20240618'))=6 then date('20240618')-1 when dayofweek(date('20240618'))=7 then date('20240618') end ;
Vertica 输出结果:
在 vertica 中可以执行,如下所示:
2024/6/14
WutongDB 输出结果:
在梧桐数据库显示找不到该函数 ,如下所示:
function dayofweek(date) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
- 使用
EXTRACT(DOW)
函数:
SELECT EXTRACT(DOW FROM date);
- 使用
15. dayofweek_iso
功能说明:
dayofweek_iso(date)
函数返回指定日期对应的 ISO 标准中的星期几, 1 表示星期一, 7 表示星期日。测试语句:
select dayofweek_iso(timestamp 'sep 22,2011 12:34');
Vertica 输出结果:
在 vertica 中可以执行,如下所示:
4
WutongDB 输出结果:
在梧桐数据库显示找不到该函数 ,如下所示:
function dayofweek_iso(timestamp without time zone) does not exist
Wutong DB 5.4 替代方案:
Wutong DB 5.4 中并不支持
ISODOW
,可以使用以下方式手动计算:SELECT (EXTRACT(DOW FROM date) + 6) % 7 + 1;
Wutong DB 6 替代方案:
使用
EXTRACT(ISODOW)
:SELECT EXTRACT(ISODOW FROM date);
16. dayofyear
功能说明:
dayofyear(date)
函数返回指定日期在一年中的第几天,通常用于计算日期在年度中的位置。测试语句:
select dayofyear(last_day(to_date(to_char(202405),'yyyymm')));
Vertica 输出结果:
在 vertica 中可以执行,如下所示:
152
WutongDB 输出结果:
在梧桐数据库显示找不到该函数 ,如下所示:
function dayofyear(date) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
- 使用
EXTRACT
计算天数:
SELECT EXTRACT(DOY FROM date);
- 使用
17. days
功能说明:
days(date)
函数返回日期从纪元到当前日期之间的天数。它通常用于日期计算和比较。测试语句:
select deal_date, -- 终端号 case when separate_days is null and max_match_date is not null then days('2024-06-18') - days(date(to_char(max_match_date))) when separate_days is null and max_match_date is null then days('2024-06-18') - days(so_date) when separate_days is not null then separate_days end, is_imei2 from gs_test.test_function_days where is_imei2_number = 0 -- 无双卡情况 ;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库显示找不到该函数 ,如下所示:
function days(unknown) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
- 两个版本都支持直接计算日期之间的天数:
SELECT date1 - date2;
18. extract
功能说明:
extract(field from source)
函数用于从日期或时间中提取指定的部分(如年、月、日等)。与date_part
类似,但更常见于 SQL 标准。测试语句:
select prov_area_code, roam_area_code, serv_number, extract( day from (max(max_date_time) - min(min_date_time)) ) time_cha, -- 时间差值 count(distinct lac_cell) lac_count, roam_duration from gs_test.test_function_extract where statis_day = 20240618 group by prov_area_code, roam_area_code, serv_number, roam_duration order by prov_area_code, roam_area_code, serv_number;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
19. getdate
功能说明:
getdate()
函数返回当前的日期和时间。与current_timestamp
类似,但在不同数据库中的实现可能有所不同。测试语句:
select getdate();
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2024-06-18 14:46:38.965
WutongDB 输出结果:
在梧桐数据库运行出错,找不到该函数,如下所示:
function getdate() does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
两个版本都支持使用
CURRENT_TIMESTAMP
返回当前系统日期和时间:SELECT CURRENT_TIMESTAMP;
20. getutcdate
功能说明:
getutcdate()
函数返回当前的 UTC 日期和时间。它通常用于处理跨时区的数据。测试语句:
select getutcdate();
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2024/6/17 9:49:35
WutongDB 输出结果:
在梧桐数据库运行出错,找不到该函数,如下所示:
function getutcdate() does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
两个版本都支持通过
CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
返回当前 UTC 日期和时间:SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC';
21. hour
功能说明:
hour(time)
函数返回时间中的“小时”部分。它通常用于从时间戳中提取小时信息。测试语句:
select hour(timestamp 'sep 22,2011 12:34');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
12
WutongDB 输出结果:
在梧桐数据库运行出错,找不到该函数,如下所示:
function hour(timestamp without time zone) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
- 使用
EXTRACT(HOUR FROM timestamp)
:
SELECT EXTRACT(HOUR FROM timestamp '2024-07-13 10:30:00');
- 使用
22. isfinite
功能说明:
isfinite(timestamp)
函数用于检查时间戳是否为有限时间。返回布尔值,用于判断日期时间的有效性。测试语句:
select isfinite(timestamp '2009-02-16 21:28:30');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
TRUE
WutongDB 输出结果:
在梧桐数据库运行结果如下所示:
TRUE
23. julian_day
功能说明:
julian_day(date)
函数返回指定日期的儒略日数,即从公元前 4713 年 1 月 1 日开始的天数。测试语句:
select julian_day(date '2001-01-01');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2451911
WutongDB 输出结果:
在梧桐数据库运行出错,找不到该函数,如下所示:
function julian_day(date) does not exist
Wutong DB 5.4 替代方案:
Wutong DB 5.4 不支持
EXTRACT(JULIAN)
,需要使用自定义公式计算儒略日:SELECT FLOOR(EXTRACT(EPOCH FROM date) / 86400 + 2440587.5);
Wutong DB 6 替代方案:
从 Wutong DB 9.4 开始支持
EXTRACT(JULIAN)
:SELECT EXTRACT(JULIAN FROM date);
24. last_day
功能说明:
last_day(date)
函数返回指定日期所在月份的最后一天。它通常用于月底计算。测试语句:
select c.goal_01 * day(last_day('2024-06-01')) goal_mon from gs_test.test_function_last_day c order by goal_mon;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
25. localtime
功能说明:
localtime
函数返回当前的时间,精度与current_time
相同,但不包括时区信息。测试语句:
select localtime;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
18:06:41
WutongDB 输出结果:
在梧桐数据库输出结果如下所示:(输出格式不同)
18:07:17.192392
26. localtimestamp
功能说明:
localtimestamp(precision)
函数返回当前的日期和时间,不包括时区信息。精度由参数指定。测试语句:
select localtimestamp(2);
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2024-06-17 18:09:38.620
WutongDB 输出结果:
在梧桐数据库输出结果如下所示:
2024-06-17 18:09:50.53
27. microsecond
功能说明:
microsecond(timestamp)
函数返回时间戳中的微秒部分。它常用于从精确到微秒的时间戳中提取微秒信息。测试语句:
select microsecond(timestamp 'sep 22,2011 12:34:01.123456');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
123456
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function microsecond(timestamp without time zone) does not exist
Wutong DB 5.4 替代方案:
Wutong DB 5.4 不直接支持
EXTRACT(MICROSECONDS)
,可以使用以下方式提取微秒部分:SELECT EXTRACT(SECOND FROM timestamp) * 1000000;
Wutong DB 6 替代方案:
Wutong DB 6 直接支持
EXTRACT(MICROSECONDS)
:SELECT EXTRACT(MICROSECONDS FROM timestamp);
28. midnight_seconds
功能说明:
midnight_seconds(timestamp)
函数返回从午夜开始到指定时间的秒数。这个函数通常用于计算一天内经过了多少秒。测试语句:
select midnight_seconds('3-3-2016 12:00'::timestamp);
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
43200
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function midnight_seconds(timestamp without time zone) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
两个版本都支持使用以下公式计算自午夜以来的秒数:
SELECT EXTRACT(EPOCH FROM time) - EXTRACT(EPOCH FROM time '00:00:00');
29. minute
功能说明:
minute(time)
函数返回时间中的“分钟”部分。它通常用于从时间戳中提取分钟信息。测试语句:
select minute('12:34:03.456789');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
34
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function minute(unknown) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
使用
EXTRACT(MINUTE FROM timestamp)
:SELECT EXTRACT(MINUTE FROM timestamp '2024-07-13 10:30:00');
30. month
功能说明:
month(date)
函数返回日期中的“月”部分。该函数常用于从日期中提取月份信息。测试语句:
select grid_code,-- 网格编码 round((sum(case when statis_month<=202405 and floor(statis_month/100)=2024 then count_user_c else 0 end)/month(to_date(to_char(202405),'yyyymmdd')))- (sum(case when statis_month<=202404 and floor(statis_month/100)=2023 then count_user_c else 0 end)/month(to_date(to_char(202404),'yyyymmdd'))),2) average_user_increase_c --C 侧月均出账客户增加 from gs_test.test_function_month group by grid_code order by grid_code,average_user_increase_c;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
31. months_between
功能说明:
months_between(date1, date2)
函数计算两个日期之间的月份数。返回的值可以是小数,表示不完整的月数。测试语句:
select up_area_code, serv_number, gprs_use_b/(months_between( to_date(to_char(202405),'yyyymmdd'), to_date(to_char(join_month),'yyyymmdd'))+1) gprs_use_b from gs_test.test_function_months_between where join_month>202312 order by up_area_code,serv_number,gprs_use_b;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
32. new_time
功能说明:
new_time(timestamp, timezone1, timezone2)
函数将给定的时间戳从一个时区转换为另一个时区。它用于跨时区时间的转换。测试语句:
select new_time('01-01-12 01:00:00','EST','PST');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2011-12-31 22:00:00.000
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function new_time(unknown, unknown, unknown) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
两个版本都支持使用
AT TIME ZONE
进行时区转换:SELECT timestamp AT TIME ZONE 'timezone1' AT TIME ZONE 'timezone2';
33. next_day
功能说明:
next_day(date, day_of_week)
函数返回从指定日期开始的下一个指定星期几的日期。例如,如果指定日期是星期一,并且 day_of_week 是“ Friday”,该函数将返回下一个星期五的日期。测试语句:
select next_day('4-29-2016'::timestamp,'Monday');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2016-05-02
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function next_day(timestamp without time zone, unknown) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
Wutong DB 5.4 和 Wutong DB 6 不提供
next_day()
函数,可以通过以下 SQL 逻辑计算下一个星期几的日期:SELECT date '2024-03-01' + ((day_of_week - EXTRACT(DOW FROM date '2024-03-01') + 7) % 7);
函数说明:
EXTRACT(DOW FROM date)
:返回给定日期是星期几,0 表示星期日,6 表示星期六。
34. now
功能说明:
now()
函数返回当前的日期和时间,包括时区信息。这个函数常用于记录操作发生的时间点。测试语句:
select now();
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2024-06-18 09:56:28.338
WutongDB 输出结果:
在梧桐数据库输出结果如下所示:
2024-06-18 09:56:24.683015+08:00
35. overlaps
功能说明:
overlaps (interval1, interval2)
函数用于判断两个时间间隔是否重叠。如果两个时间段有重叠部分,则返回 TRUE,否则返回 FALSE。测试语句:
select (date '2016-02-16',date '2016-12-21') overlaps(date '2008-10-30',date '2016-10-30');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
TRUE
WutongDB 输出结果:
在梧桐数据库输出结果如下所示:
TRUE
36. quarter
功能说明:
quarter(date)
函数返回日期所在的季度( 1 到 4 )。这个函数常用于基于季度的分析。测试语句:
select case when quarter('2024-06-18') = 1 then '20220101' when quarter('2024-06-18') = 2 then '20220401' when quarter('2024-06-18') = 3 then '20220701' when quarter('2024-06-18') = 4 then '20221001' end;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
20220401
WutongDB 输出结果:
在梧桐数据库输出结果如下所示:
20220401
37. round
功能说明:
round(date, unit)
函数用于将日期或时间值舍入到指定的单位。单位可以是年、月、日等。测试语句:
select grid_code , -- 网格编码 round(case when sum(case when data_time =202405 then fees else 0 end) <> 0 then (sum(case when data_time =202405 and coalesce(class1,'') ='1003' then fees else 0 end)/ sum(case when data_time =202405 then fees else 0 end))*100 else 0 end,2) incen_fro_business_m_zb, -- 当月业务激励占比 round(case when sum(case when data_time =202405 then fees else 0 end) <> 0 then (sum(case when data_time =202405 and coalesce(class1,'') ='1005' then fees else 0 end)/ sum(case when data_time =202405 then fees else 0 end))*100 else 0 end,2) basis_protection_m_zb, -- 当月基本保障占比 round(case when sum(case when data_time =202405 then fees else 0 end) <> 0 then (sum(case when data_time =202405 and coalesce(class1,'') ='1008' then fees else 0 end)/ sum(case when data_time =202405 then fees else 0 end))*100 else 0 end,2) cose_lins_m_zb, -- 当月成本支出占比 round(case when sum(case when data_time <=202405 then fees else 0 end) <> 0 then ((sum(case when data_time <=202405 and coalesce(class1,'') ='1003' then fees else 0 end)/202401)/ ((sum(case when data_time <=202405 then fees else 0 end))/202401))*100 else 0 end,2) incen_fro_business_y_zb, -- 当年业务激励占比 round(case when sum(case when data_time<=202405 then fees else 0 end) <> 0 then ((sum(case when data_time <=202405 and coalesce(class1,'') ='1005' then fees else 0 end)/202401)/ ((sum(case when data_time <=202405 then fees else 0 end))/202401))*100 else 0 end,2) basis_protection_y_zb, -- 当年基本保障占比 round(case when sum(case when data_time <=202405 then fees else 0 end) <> 0 then ((sum(case when data_time <=202405 and coalesce(class1,'') ='1008' then fees else 0 end)/202401)/ ((sum(case when data_time <=202405 then fees else 0 end))/202401))*100 else 0 end,2) cose_lins_y_zb -- 当年成本支出占比 from gs_test.test_function_round where data_time>=202401 group by grid_code order by grid_code,incen_fro_business_m_zb,basis_protection_m_zb,cose_lins_m_zb,incen_fro_business_y_zb,basis_protection_y_zb,cose_lins_y_zb limit 10;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:(前三个字段小数保留位数不一致)
38. second
功能说明:
second(time)
函数返回时间中的“秒”部分。它通常用于从时间戳中提取秒的信息。测试语句:
select second('23:34:03.456789');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
3
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function second(unknown) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
使用
EXTRACT(SECOND FROM timestamp)
:SELECT EXTRACT(SECOND FROM timestamp '2024-07-13 10:30:00');
39. statement_timestamp
功能说明:
statement_timestamp()
函数返回当前语句的开始时间戳。与transaction_timestamp
类似,但statement_timestamp
专门用于标识当前 SQL 语句的执行时间。测试语句:
select statement_timestamp();
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2024-06-18 10:05:23.022
WutongDB 输出结果:
在梧桐数据库输结果如下所示:(输出格式不同)
2024-06-18 10:05:20.879817+08:00
40. sysdate
功能说明:
sysdate()
函数返回数据库服务器的当前日期和时间。与current_timestamp
类似,但通常更加依赖于数据库的时间设置。测试语句:
select to_char(sysdate()-1,'YYYYMMDD') deal_cycle;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
20240618
WutongDB 输出结果:
在梧桐数据库输结果如下所示:(输出格式不同)
select to_char(sysdate()-1,'YYYYMMDD') deal_cycle;
41. time_slice
功能说明:
time_slice(timestamp, interval)
函数用于将时间戳切片,返回与时间戳最近的指定间隔的开始时间。它用于时间序列分析和数据分割。测试语句:
select time_slice('2009-09-09 00:00:01',3);
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
2009-09-09 00:00:00.000
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function time_slice(unknown, integer) does not exist
Wutong DB 5.4 与 Wutong DB 6 替代方案:
Wutong DB 5.4 中不支持高级时间切分函数,可以使用
date_trunc()
结合简单的时间间隔操作:SELECT date_trunc('minute', timestamp) + INTERVAL '30 minutes';
42. timeofday
功能说明:
timeofday()
函数返回当前时间,包括日期、时间、时区和其他信息。它在一些数据库中返回与now()
类似的结果。测试语句:
select timeofday();
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下所示:
Tue Jun 18 10:10:35.155199 2024 CST
WutongDB 输出结果:
在梧桐数据库输出结果如下所示:(输出格式不同)
Tue Jun 18 10:10:17.561651 2024 +08:00
43. timestampadd
功能说明:
timestampadd(unit, value, timestamp)
函数将指定的时间单位和值添加到时间戳中,返回一个新的时间戳。常用于调整时间戳,例如加上几天或几小时。测试语句:
select distinct cast ( case when product_name = ' 千里眼 ' and to_number(over_duration) - to_number(approval_time) > 48 then to_number(over_duration) - to_number(approval_time) -48 when product_name = ' 政企宽带 ' and to_number(substr(createtime, 12, 2)) < 16 and approval_Date is null and active_Date is null and to_number(substr(createtime, 10, 2)) <> to_number(substr(netendtime, 10, 2)) then timestampDIFF( 'minute', (to_timestamp(createtime, 'YYYY-MM-DD 00:00:00') + 1), (to_timestamp(netendtime, 'YYYY-MM-DD HH:MI:SS')) ) / 60 when product_name = ' 政企宽带 ' and to_number(substr(createtime, 12, 2)) >= 16 and approval_Date is null and active_Date is null and timestampdiff( day, to_timestamp(createtime, 'YYYY-MM-DD HH:MI:SS'), to_timestamp(netendtime, 'YYYY-MM-DD HH:MI:SS') ) > 0 and to_timestamp(netendtime, 'YYYY-MM-DD HH:MI:SS') > timestampadd( 'hour', 12, to_timestamp(createtime, 'YYYY-MM-DD 00:00:00') + 1 ) then timestampDIFF( 'minute', ( timestampadd( 'hour', 12, to_timestamp(createtime, 'YYYY-MM-DD 00:00:00') + 1 ) ), (to_timestamp(netendtime, 'YYYY-MM-DD HH:MI:SS')) ) / 60 when product_name = ' 政企宽带 ' and approval_Date is not null and active_Date is not null and to_number(over_duration) - to_number(approval_time) > 12 then to_number(over_duration) - to_number(approval_time) - 12 else null end as decimal(12, 2) ) as over_duration, cast ( to_number(over_duration) - to_number(approval_time) as decimal(12, 2) ) as over_time, case when ( product_name = ' 千里眼 ' and to_number(over_duration) - to_number(approval_time) > 48 ) or ( product_name = ' 政企宽带 ' and to_number(substr(createtime, 12, 2)) < 16 and approval_Date is null and active_Date is null and to_number(substr(createtime, 10, 2)) <> to_number(substr(netendtime, 10, 2)) ) or ( product_name = ' 政企宽带 ' and to_number(substr(createtime, 12, 2)) >= 16 and approval_Date is null and active_Date is null and timestampdiff( day, to_timestamp(createtime, 'YYYY-MM-DD HH:MI:SS'), to_timestamp(netendtime, 'YYYY-MM-DD HH:MI:SS') ) > 0 and to_timestamp(netendtime, 'YYYY-MM-DD HH:MI:SS') > timestampadd( 'hour', 12, to_timestamp(createtime, 'YYYY-MM-DD 00:00:00') + 1 ) ) or ( product_name = ' 政企宽带 ' and approval_Date is not null and active_Date is not null and to_number(over_duration) - to_number(approval_time) > 12 ) then '1' else '0' end as is_overtime -- 是否超时 1 为是 0 为否 from gs_test.test_function_timestampadd where statis_day = '20240618' order by over_duration, over_time, is_overtime;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出错误 ,结果如下所示:
operator does not exist: timestamp with time zone + integer
Wutong DB 5.4 和 Wutong DB 6 替代方案:
使用
INTERVAL
操作符:SELECT timestamp '2024-01-01' + INTERVAL '1 day';
44. timestampdiff
功能说明:
timestampdiff(unit, timestamp1, timestamp2)
函数计算两个时间戳之间的差异,并以指定的单位返回结果,例如天、小时、分钟等。测试语句:
select statis_day, -- 统计日期 serv_number, -- 用户号码 call_date, -- 通话日期 timestampdiff(minute, login_time, leave_time) duration, sum((up_data_flux)) up_data_flux, -- 上行数据流量 sum((down_data_flux)) down_data_flux -- 下行数据流量 from gs_test.test_function_timestampdiff where statis_day = 20240618 group by statis_day, serv_number, call_date, timestampdiff(minute, login_time, leave_time) order by statis_day, serv_number, call_date, duration, up_data_flux, down_data_flux;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
Wutong DB 输出结果:
在梧桐数据库输出错误 ,结果如下所示:
column "minute" does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
Wutong DB 没有
timestampdiff
函数,但可以使用AGE()
或EXTRACT()
函数结合日期相减来实现。计算两个时间戳之间的差异(自定义时间单位):
- 计算年差异:
SELECT EXTRACT(YEAR FROM AGE(timestamp1, timestamp2));
- 计算月差异:
SELECT EXTRACT(YEAR FROM AGE(timestamp1, timestamp2)) * 12 + EXTRACT(MONTH FROM AGE(timestamp1, timestamp2));
- 计算天数差异:
SELECT EXTRACT(DAY FROM (timestamp1 - timestamp2));
- 计算小时差异:
SELECT EXTRACT(EPOCH FROM (timestamp1 - timestamp2)) / 3600;
- 计算分钟差异:
SELECT EXTRACT(EPOCH FROM (timestamp1 - timestamp2)) / 60;
- 计算秒差异:
SELECT EXTRACT(EPOCH FROM (timestamp1 - timestamp2));
解释:
AGE()
用于计算两个时间戳之间的年、月差异。EXTRACT(EPOCH)
将时间差转换为秒,可以根据需要转换为小时、分钟等单位。
45. timestamp_round
功能说明:
timestamp_round(timestamp, unit)
函数用于将时间戳舍入到最近的指定单位(如分钟、小时、天)。它用于简化时间戳以便于分析。测试语句:
select timestamp_round('9-22-2011 12:34:00'::timestamp,'MM');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
2011-10-01 00:00:00.000
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function timestamp_round(timestamp without time zone, unknown) does not exist
Wutong DB 5.4 替代方案:
Wutong DB 5.4 没有
timestamp_round()
函数,可以通过手动四舍五入实现:SELECT date_trunc('minute', timestamp) + INTERVAL '30 seconds';
Wutong DB 6 替代方案:
Wutong DB 6 版本同样不直接支持
timestamp_round()
,可以使用相同的逻辑进行手动实现。
46. timestamp_trunc
功能说明:
timestamp_trunc(timestamp, unit)
函数用于截断时间戳到指定的时间单位。与timestamp_round
类似,但它总是向下舍入到最近的单位边界。测试语句:
select timestamp_trunc('9-22-2011 12:34:00'::timestamp,'MM');
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
2011-09-01 00:00:00.000
WutongDB 输出结果:
在梧桐数据库输出错误 ,找不到该函数,结果如下所示:
function timestamp_trunc(timestamp without time zone, unknown) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
两个版本都支持
date_trunc()
函数:SELECT date_trunc('hour', timestamp);
47. transaction_timestamp
功能说明:
transaction_timestamp()
函数返回当前事务的开始时间戳。与statement_timestamp
不同,它在整个事务过程中保持不变。测试语句:
select transaction_timestamp();
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
2024-06-18 10:50:46.644
WutongDB 输出结果:
在梧桐数据库输出结果如下所示:
2024-06-18 10:50:32.273504+08:00
48. trunc
功能说明:
trunc(date, unit)
函数用于截断日期或时间到指定的单位,例如年、月、日等。它在日期操作中用于简化日期。测试语句:
select distinct serv_number, case when (trunc(202405/100)*12 + mod(202405,100)) - (year(date(cur_valid_imei_date))*12 + month(date(cur_valid_imei_date))) > 999 then 999 when (trunc(202405/100)*12 + mod(202405,100)) - (year(date(cur_valid_imei_date))*12 + month(date(cur_valid_imei_date))) <= 0 then 1 else (trunc(202405/100)*12 + mod(202405,100)) - (year(date(cur_valid_imei_date))*12 + month(date(cur_valid_imei_date))) end num from gs_test.test_function_trunc order by serv_number,num;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出出错,找不到该函数,结果如下所示:
function year(date) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
- 使用
date_trunc()
替代:
SELECT date_trunc('month', timestamp '2024-07-13 10:30:00');
- 使用
49. week
功能说明:
week(date)
函数返回日期在一年中的第几周,通常用于周报或周度分析。测试语句:
select statis_month, area_code, opp_area_code, opp_brand, serv_number, opp_number, count(*), count(distinct week(call_date)), count(distinct case when to_number(to_char(call_date,'dd'))<=10 then 1 when to_number(to_char(call_date,'dd'))>10 AND to_number(to_char(call_date,'dd'))<=20 then 2 else 3 end), sum(coalesce(call_duration,0)), sum(coalesce(call_fee_duration,0)), sum(coalesce(call_count,0)) from gs_test.test_function_week where area_code between '930' and '931' group by statis_month, area_code, serv_number, opp_number, opp_area_code, opp_brand order by statis_month, area_code, serv_number, opp_number, opp_area_code, opp_brand;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出出错,找不到该函数,结果如下所示:
function week(date) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
使用
EXTRACT(WEEK FROM date)
:SELECT EXTRACT(WEEK FROM date);
50. week_iso
功能说明:
week_iso(date)
函数返回日期在 ISO 标准中所在的周数。 ISO 周从周一开始,以年度第一个周一为标准。测试语句:
select week_iso('1-4-2016'::date);
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
1
WutongDB 输出结果:
在梧桐数据库输出出错,找不到该函数,结果如下所示:
function week_iso(date) does not exist
Wutong DB 5.4 替代方案:
Wutong DB 5.4 不支持直接获取 ISO 标准的周数,但可以通过手动计算方式实现。可以使用
EXTRACT
和一些调整逻辑计算 ISO 周数:SELECT EXTRACT(WEEK FROM date) - CASE WHEN EXTRACT(DOW FROM date) = 1 THEN 1 ELSE 0 END;
解释:
EXTRACT(WEEK FROM date)
获取标准周数。EXTRACT(DOW FROM date)
获取周几的数字(0 表示周日,1 表示周一)。- 如果日期为周一之前的日子,则减去 1 以符合 ISO 标准。
Wutong DB 6 替代方案:
从 Wutong DB 9.5 开始,Wutong DB 支持直接使用
EXTRACT(ISOWEEK)
提取 ISO 标准的周数:SELECT EXTRACT(ISOWEEK FROM date);
解释:
EXTRACT(ISOWEEK)
提取 ISO 标准的周数,符合 ISO 8601 标准。
51. year
功能说明:
year(date)
函数返回日期中的“年”部分。它通常用于从日期中提取年份信息。测试语句:
select distinct serv_number, -- 用户号码 year(now()) - to_number(substring(to_char(birth_date, 'yyyymmdd'), 1, 4)) birth_date, floor( ( to_number(to_char(sysdate(), 'yyyymmdd')) - to_number(substring(to_char(birth_date, 'yyyymmdd'), 1, 8)) ) / 10000 ) birth_date2 from gs_test.test_function_year where birth_date is not null and length(serv_number) = '11' --- 号码长度等于 11 位,剔除物联网用户 -- and substr(serv_number,1,2) <>'10' and substr(serv_number,1,2) <>'11' and substr(serv_number,1,2) <>'12' and substr(serv_number,1,1) ='1' and reg_type='100000001' order by serv_number, birth_date, birth_date2;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出出错,找不到该函数,结果如下所示:
function year(timestamp with time zone) does not exist
Wutong DB 5.4 和 Wutong DB 6 替代方案:
两个版本都支持
EXTRACT(YEAR)
:SELECT EXTRACT(YEAR FROM date);
52. year_iso
功能说明:
year_iso(date)
函数返回 ISO 标准下的年份,这对于跨年周的日期特别有用。测试语句:
select year_iso('1-4-2016'::date);
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
2016
WutongDB 输出结果:
在梧桐数据库输出出错,找不到该函数,结果如下所示:
function year_iso(date) does not exist
Wutong DB 5.4 替代方案:
Wutong DB 5.4 不支持
EXTRACT(ISOYEAR)
,可以通过自定义公式计算:SELECT CASE WHEN EXTRACT(DOW FROM date) = 1 AND EXTRACT(WEEK FROM date) = 1 THEN EXTRACT(YEAR FROM date) - 1 ELSE EXTRACT(YEAR FROM date) END;
Wutong DB 6 替代方案:
Wutong DB 6 版本支持
EXTRACT(ISOYEAR)
:SELECT EXTRACT(ISOYEAR FROM date);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。