-- * 注意: 本文的SQL是在 2017-09-14 測試的. 所以如果取當前日期, 結果為 2017-09-14*
----------------------------
-- 相關數據類型
----------------------------
vertica 的 Date 類型僅包含日期, 而Oracle的Date的類不僅包含日期而且包含時間.
vertica 的 time, 不帶日期, 僅包含小時分秒
vertica 的 timestamp 是完整的時間, 包含日期和時分秒
vertica 的 Datetime 類型是 timestamp 類型的同義詞
interval 也是一種數據類型, 下面是幾個示例:
interval '1:10:20' --時間間隔為1小時 10分 20秒
interval '5 year 1 month 1:10:20' --時間間隔為5年1一個月1個小時 10分 20秒
interval 中的時間單位包含year/month/day/hour/minute/second, 在表達式中既可以使用單數形式的英文, 也可以使用復數形式.
Interval 后面字符串如果是冒號的, 可以不用寫單位, '1:2:3' 即是小時/分鍾/秒.
Interval 后面字符串如果不是冒號的, 沒有寫單位, 即表示天數.
在Table中, 可以定義兩種類型的interval字段, 分別是:
(1) INTERVAL DAY TO SECOND, 這個較為常用,精度是微秒,正負一億多天的范圍, 如果使用 literal的方式插值, 可以是幾天幾個小時幾分幾秒
(2) INTERVAL YEAR TO MONTH, 精度是到月,范圍超級大, 如果使用 literal的方式插值, 可以是幾年幾個月, d但不能包含幾天幾個小時幾分幾秒
----------------------------
-- literal date/timestamp cast
----------------------------
select date '2014-07-25' --OK
select date('2014-07-25') --OK
select date('20140725') --OK
select date('2014/07/25') --OK
select date('now') -- 當天
select date('TODAY') -- 當天
select date('YESTERDAY') -- 昨天
select date('TOMORROW') -- 明天
----------------------------
-- 得到當前日期和時間戳
----------------------------
date('now') --result: 2017-09-14
date('TODAY') --result: 2017-09-14
select current_date --result: 2017-09-14
SELECT sysdate() --result: 2017-09-14 13:07:59
SELECT SYSDATE --result: 2017-09-14 13:07:59
select CURRENT_TIMESTAMP --result: 2017-09-14 13:07:59
select GETDATE() --返回當前時間戳, 注意是時間戳
select GETUTCDATE() --返回當前UTC的時間戳, 注意是時間戳
SELECT CURRENT_TIME --僅僅包含時間, 不包含日期
----------------------------
-- 數據類型轉換和extract提取
----------------------------
select TO_DATE('20100101','YYYYMMDD')
select date(current_timestamp) -- timestamp 可以直接轉成date類
select TO_TIMESTAMP('20100101 ','YYYYMMDD') -- 轉成時間戳格式
SELECT TO_TIMESTAMP('20100101 23:59:59','YYYYMMDD HH24:MI:SS')
SELECT TO_TIMESTAMP('20100101 23:59:59:999 ','YYYYMMDD HH24:MI:SS:MS')
select date('now') + interval '0' -- date 轉成 timestamp
select to_char(current_date ,'YYYYMMDD') -- date轉字符串
select to_char(current_timestamp,'YYYYMMDD HH24:MI:SS') -- timestamp轉字符串
select date(current_timestamp) -- timestamp 可以直接轉成date類
select year(current_timestamp) --extract year
select month(current_timestamp) --extract month
SELECT day(current_timestamp) --extract day
select hour(CURRENT_TIME) --extract 小時值
select minute(CURRENT_TIME) --extract 分鍾值
select week(sysdate); -- 當前在當年中的第幾周
select quarter(sysdate); -- 當前是哪個季度
select date_part('doy',sysdate) -- 當天是當年的第幾天, doy即 day of year
select date_part('dow',sysdate) -- 當天是當周中的第幾天, dow 即 day of week
select date_part('month', sysdate) -- 當天的月份
----------------------------
-- 時間加減
-- date和timestamp都可以直接加數值, 也可以加 interval.
-- 加數值的話, 原來是什么類型結果就是什么類型.
-- 加一個interval, 其結果一定是 timestamp(即使原來是date類型)
----------------------------
select TIMESTAMPADD('DAY',-1,SYSDATE) -- 通用的數據加減函數
select date('TOMORROW') - date('today') -- 相差一天, 結果是:數值1
select date('now')+1 -- 結果為明天
select current_timestamp + interval '1' --結果是時間戳,明天的同一時間
select date('now') + interval '20 day' -- 加20天, 結果是時間戳
SELECT date('now') + interval '6:6:6' --結果是時間戳, 2017-09-14 06:06:06
select date('now') + interval '1' --結果是時間戳, 明天的零點
select date('now') + interval '0:1' --結果是時間戳, 明天的零點
select date('now') + interval '20 year' --結果是時間戳, 加20年
select current_timestamp + 1 --結果是時間戳,明天的同一時間
select current_timestamp + interval '1' --結果是時間戳,明天的同一時間
select date('now') + interval '0' -- date 轉成 timestamp
SELECT ADD_MONTHS('20170131', 1) -- 加一個月, 結果為 2017-02-28
SELECT ADD_MONTHS('20171231', -1) -- 減一個月, 結果為 2017-11-30
----------------------------
-- 求時間間隔
----------------------------
SELECT TIMESTAMPDIFF(unit,A,B) -- B>A, 返回正值; B=A, 返回0; B<A,返回負值
select DATEDIFF(unit,A,B) -- B>A, 返回正值; B=A, 返回0; B<A,返回負值
select DATEDIFF('SECOND',sysdate+1,sysdate) -- (-86400)
select DATEDIFF('minute',sysdate,sysdate+1) -- 1440
select age_in_months(date('now'),date('now') + interval '1 year') --相差幾個月, 結果是-12
select age_in_months(date('now'),date('now') + interval '1 year') --相差幾個月, 結果是-12
select age_in_years(date('now') + interval '18 month' ,date('now') ) --相差幾年,結果是1
select age_in_years(date('now') ,date('now') + interval '18 month') --相差幾年,結果是-2
----------------------------
-- 幾個關鍵詞
----------------------------
select CURRENT_DATABASE --CURRENT_DATABASE 是關鍵詞, 但也可當函數用 CURRENT_DATABASE()
select CURRENT_SCHEMA --CURRENT_SCHEMA 是關鍵詞, 但也可當函數用 CURRENT_SCHEMA()
select CURRENT_USER --CURRENT_USER 是關鍵字, 但也可當函數用 CURRENT_USER()
select current_date --current_date 是關鍵字, 但可也當函數用 current_date()
SELECT CURRENT_TIME -- CURRENT_TIME 是關鍵字, 不同於其他CURRENT開頭的關鍵詞, 這個關鍵詞不能當函數使用 , select CURRENT_TIME() 會報錯, 返回值僅僅包含時間, 不包含日期
SELECT current_timestamp -- current_timestamp 是關鍵字, 不同於其他CURRENT開頭的關鍵詞, 這個關鍵詞不能當函數使用 , select current_timestamp() 會報錯
----------------------------
-- 時間格式化的指示字符串
----------------------------
Impala 和 Hive 等時間格式化的指示字符串寫法和Java一樣, 另外大小寫是敏感的
Vertica 的時間格式化的指示字符串寫法和Oracle一樣, 大小寫不銘感.
尤其是月份和分鍾, mm在impala代表的是分鍾, 在verica中代表的是月份, 不要混淆.
幾個例子:
select to_timestamp('2018-05-16 12:19:37','yyyy-MM-dd')
-- Vertica的結果為 2018-05-16 00:00:00
-- impala的結果:2018-05-16 00:00:00
select to_timestamp('2018-05-16 12:19:37','yyyy-MM-dd HH:mm:ss')
-- Vertica的結果為 2019-07-19 12:00:37, !!錯誤!!
-- impala的結果: 2018-05-16 12:19:37
select to_timestamp('2018-05-16 12:19:37','yyyy-MM-dd HH:mi:ss')
-- Vertica的結果為 2018-05-16 12:19:37
-- impala執行會報錯
select to_timestamp('2018-05-16 12:19:37','yyyy-MM-dd HH24:mi:ss')
-- Vertica的結果為 2018-05-16 12:19:37
-- impala執行會報錯