因公司的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