实测: Vertica 与 WutongDB 函数对比测试之 _ 日期时间函数函数篇测试环境: Vertica: Ver
测试环境:
-
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()
函数结合日期的相减操作来实现。-
计算天数差异:
- 使用日期相减直接返回两个日期之间的天数差异:
SELECT date1 - date2;
-
计算年、月差异:
- 使用
AGE()
函数来返回年、月差异:
SELECT AGE(date1, date2);
- 使用
-
如果需要获取更精确的天、月、年差异,可以结合
EXTRACT
函数来处理特定的时间单位:-- 计算年份差异 SELECT EXTRACT(YEAR FROM AGE(date1, date2)); -- 计算月份差异 SELECT EXTRACT(MONTH FROM AGE(date1, date2)); -- 计算天数差异 SELECT EXTRACT(DAY FROM AGE(date1, date2));
-
自定义日期差异(如小时、分钟、秒):
- 使用
EXTRACT
函数计算自定义单位的差异:
-- 计算小时差异 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);
转载自:https://juejin.cn/post/7426587845350342697