hive计算周几函数遇见的结果差1的问题(DATEDIFF和pmod)

因公司的hive版本较低,不支持计算周几的函数dayofweek。只能用

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

来计算周几。但是后面发现与

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

返回结果不一致,然后就进行了一些 探索(注,CURRENT_DATE和current_timestamp 是9.17做的)

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(周日)
  ;

结论:
1、 pmod(datediff(日期时间型, ‘1920-01-01’) -3, 7),返回的是0-6(周一到周日)
2、 pmod(datediff(字符型型, ‘1920-01-01’) -3, 7),返回的是1-6,0(周一到周六,周日,0对应周日)
3、 pmod(datediff(日期时间型, to_date(‘1920-01-01’)) -3, 7),返回的是1-6,0(周一到周六,周日,0对应周日)

即,前后类型一样返回的是1-6,0(周一到周六,周日,0对应周日);前日期,后字符返回的是0-6(周一到周日)

原因出在datediff函数。

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个类型相同,否则可能会计算结果差一。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用提到了Hivepmod函数,它有两种重载形式:pmod(int a, int b)和pmod(double a, double b。该函数的作用是返回a除以b的余数。例如,pmod(9, 4)返回1,pmod(-9, 4)返回-1。 Hive还提供了许多其他函数,包括数学函数、类型转换函数、条件函数、字符函数、聚合函数和表生成函数等。您可以通过在Hive执行一些命令来查看这些函数的信息。 对于日期函数Hive在版本2.2.0及以上提供了dayofweek函数,用于获取一个日期是星期几。在低版本的Hive,原生并未提供dayofweek函数。但可以使用一种技巧来获取星期几,即使用pmod函数结合datediff函数。例如,pmod(datediff('${date}', '1920-01-01') - 3, 7)可以返回给定日期是星期几。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [29. 大数据---hive的常用函数(一(最全的函数操作))](https://blog.csdn.net/u014579001/article/details/126026596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Hive学习(7)pmod()函数详解](https://blog.csdn.net/Dreamy_zsy/article/details/113371000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值