why
最近在開發(fā)數(shù)據(jù)中臺(tái)項(xiàng)目,其他平臺(tái)的部分業(yè)務(wù)要遷移到中臺(tái)實(shí)現(xiàn),其他平臺(tái)使用的數(shù)據(jù)庫是 MySQL、Oracle 而中臺(tái)使用的是 Greenplum 數(shù)據(jù)庫,各個(gè)數(shù)據(jù)庫都有各自的函數(shù)和字段類型,以下 SQL 是 MySQL 數(shù)據(jù)庫業(yè)務(wù)遷移至 GP 數(shù)據(jù)庫的轉(zhuǎn)換。
SQL
以下 SQL 使用了 4?? 個(gè)參數(shù),日期篩選字段參數(shù):startTime、endTime(格式 2021-10-11)和時(shí)段篩選字段參數(shù):startDuration、endDuration(格式 11:50:20)。
MySQL原始SQL
原MySQL數(shù)據(jù)庫SQL(去掉一部分與時(shí)段篩選無關(guān)的代碼)
主要使用的函數(shù)有 STR_TO_DATE、SUBSTRING、DATE_ADD、date_format 而這些 GP 數(shù)據(jù)都沒有
SELECT*
FROMdata_bill b
WHERESTR_TO_DATE
( b
.call_time
, '%Y-%m-%d' ) >= STR_TO_DATE
( AND STR_TO_DATE
( b
.call_time
, '%Y-%m-%d' ) <= STR_TO_DATE
( AND STR_TO_DATE
( SUBSTRING
( b
.call_time
, 12 ), '%H:%i:%s' ) >= STR_TO_DATE
( AND STR_TO_DATE
( SUBSTRING
( b
.call_time
, 12 ), '%H:%i:%s' ) <= STR_TO_DATE
(
SELECT*
FROMdata_bill b
WHERESTR_TO_DATE
( b
.call_time
, '%Y-%m-%d' ) >= STR_TO_DATE
( AND STR_TO_DATE
( b
.call_time
, '%Y-%m-%d' ) <= STR_TO_DATE
( AND ((STR_TO_DATE
( SUBSTRING
( b
.call_time
, 12 ), '%H:%i:%s' ) >= STR_TO_DATE
( AND STR_TO_DATE
( SUBSTRING
( b
.call_time
, 12 ), '%H:%i:%s' ) <= STR_TO_DATE
( '23:59:59', '%H:%i:%s' ) ) OR (STR_TO_DATE
(SUBSTRING
( date_format
( DATE_ADD
( STR_TO_DATE
( b
.call_time
, '%Y-%m-%d %H:%i:%s' ), INTERVAL 1 DAY ), '%Y-%m-%d %H:%i:%s' ), 12 ),'%H:%i:%s' ) >= STR_TO_DATE
( '00:00:00', '%H:%i:%s' ) AND STR_TO_DATE
(SUBSTRING
( date_format
( DATE_ADD
( STR_TO_DATE
( b
.call_time
, '%Y-%m-%d %H:%i:%s' ), INTERVAL 1 DAY ), '%Y-%m-%d %H:%i:%s' ), 12 ),'%H:%i:%s' ) <= STR_TO_DATE
( ) )
Greenplum轉(zhuǎn)換后SQL
GP 數(shù)據(jù)庫轉(zhuǎn)換后的 SQL 主要使用了 date_trunc、to_date、SUBSTRING、CAST 函數(shù)
SUBSTRING 函數(shù)雖然名稱上跟 MySQL 一致 但是用法是不同的
SELECT*
FROMdata_bill
WHEREdate_trunc
( 'DAY', call_time
) >= to_date
( AND date_trunc
( 'DAY', call_time
) <= to_date
( AND call_time
>= CAST
( SUBSTRING
( '' || call_time
FROM 0 FOR 12 ) || AND call_time
<= CAST
( SUBSTRING
( '' || call_time
FROM 0 FOR 12 ) ||
SELECT*
FROMdata_bill
WHEREdate_trunc
( 'DAY', call_time
) >= to_date
( AND date_trunc
( 'DAY', call_time
) <= to_date
( AND ((call_time
>= CAST
( SUBSTRING
( '' || call_time
FROM 0 FOR 12 ) || AND call_time
<= CAST
( SUBSTRING
( '' || call_time
FROM 0 FOR 12 ) || '23:59:59' AS TIMESTAMP ) ) OR (call_time
>= CAST
( SUBSTRING
( '' || call_time
FROM 0 FOR 12 ) || '00:00:00' AS TIMESTAMP ) AND call_time
<= CAST
( SUBSTRING
( '' || call_time
FROM 0 FOR 12 ) || ) )
總結(jié)
以上是生活随笔為你收集整理的【SQL编程】Greenplum 数据库通过 timestamp 类型字段值实现数据的(日期时段筛选+时间时段筛选)跨天时段及不跨天时段SQL详情的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。