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