hive計算周幾函數碰見的結果差1的問題(DATEDIFF和pmod)

因公司的hive版本較低,不支持計算周幾的函數dayofweek。只能用sql

pmod(datediff(‘2020-09-17’, ‘1920-01-01’) -3, 7)函數

來計算周幾。可是後面發現與測試

pmod(datediff(to_date(‘2020-09-17’), ‘1920-01-01’) -3, 7)spa

返回結果不一致,而後就進行了一些 探索(注,CURRENT_DATE和current_timestamp 是9.17作的)code

select 
  -- 日期和時間形式的字符串
  pmod(datediff('2020-09-17', '1920-01-01') -3, 7) d0,  --返回4(週四)
  pmod(datediff('2020-09-17 00:00:00', '1920-01-01') -3, 7) d1,--返回4(週四)
  pmod(datediff('2020-09-17 00:00:01', '1920-01-01') -3, 7) d2,--返回4(週四)
  -- 只前面轉換爲日期或時間格式
  pmod(datediff(to_date('2020-09-17 00:00:01'), '1920-01-01') -3, 7) d3,--返回3(週四)
  pmod(datediff(cast('2020-09-17' as date), '1920-01-01') -3, 7) d4,--返回3(週四)
  pmod(datediff(cast('2020-09-17 00:00:01' as timestamp), '1920-01-01') -3, 7) d5,--返回3(週四)
  pmod(datediff(CURRENT_DATE, '1920-01-01') - 3, 7) d6,--返回3(週四)
  pmod(datediff(to_date(CURRENT_DATE), '1920-01-01') - 3, 7) d7,--返回3(週四)
  -- 兩個都是日期的
  pmod(datediff(to_date(CURRENT_DATE), to_date('1920-01-01')) - 3, 7) d8,--返回4(週四)
  -- 測試current_timestamp
  pmod(datediff(current_timestamp(), '1920-01-01') - 3, 7) d9,--返回3(週四)
  pmod(datediff(to_date(current_timestamp()), '1920-01-01') - 3, 7) d10,--返回3(週四)
  pmod(datediff(to_date(current_timestamp()), to_date('1920-01-01')) - 3, 7) d11 ,--返回4(週四)
  pmod(datediff(to_date('2020-09-17'), '1920-01-01') -3, 7) d12,--返回3(週四)
  --測試周日的返回值
  pmod(datediff(to_date('2020-09-13'), '1920-01-01') -3, 7) d13,--返回6(週日)
  pmod(datediff('2020-09-13', '1920-01-01') -3, 7) d14 ----返回0(週日)
  ;

結論:
一、 pmod(datediff(日期時間型, ‘1920-01-01’) -3, 7),返回的是0-6(週一到週日)
二、 pmod(datediff(字符型型, ‘1920-01-01’) -3, 7),返回的是1-6,0(週一到週六,週日,0對應週日)
三、 pmod(datediff(日期時間型, to_date(‘1920-01-01’)) -3, 7),返回的是1-6,0(週一到週六,週日,0對應週日)


字符串

即,先後類型同樣返回的是1-6,0(週一到週六,週日,0對應週日);前日期,後字符返回的是0-6(週一到週日)ast

緣由出在datediff函數。class

select weekofyear('2020-09-13') w1, --週日屬於上週
  weekofyear('2020-09-14') w2, --週一屬於本週
  weekofyear(to_date('2020-09-13')) w3,--週日屬於上週
  weekofyear(to_date('2020-09-14')) w4,--週一屬於本週
  datediff('2020-09-17 00:00:1', '1920-01-01'), --36785
  datediff(to_date('2020-09-17 00:00:01'), '1920-01-01') --36784
  ;

注意:weekofyear不管字符仍是日期,週一是一週的開始。
datediff函數使用時要保證相減的2個類型相同,不然可能會計算結果差一。
date

相關文章
相關標籤/搜索