Oracle排序实现周一为起始日的原理问询——解析replace(TO_CHAR(hiredate, 'd'), '1', '8')的作用
为什么
replace(TO_CHAR(hiredate, 'd'), '1', '8')能实现以周一为起始日的排序? 首先得明确Oracle中TO_CHAR(hiredate, 'd')的返回规则:默认情况下,这个格式符返回的数字范围是1到7,其中1代表周日,2代表周一,3代表周二,……,7代表周六。
如果直接用TO_CHAR(hiredate, 'd')排序,结果会是按「周日→周一→周二→…→周六」的顺序排列,这显然不符合你想要的「周一为一周起始」的需求。
那我们来看这条replace语句的作用:
- 它把
TO_CHAR(hiredate, 'd')返回的字符串'1'(也就是周日对应的标识)替换成了'8' - 而周一到周六对应的数字2-7保持不变
当数据库用这个处理后的值排序时,会把这些字符串当作数字来比较(因为都是数字字符,Oracle会自动做隐式转换),此时的数字顺序就变成了:
2(周一)→3(周二)→4(周三)→5(周四)→6(周五)→7(周六)→8(周日)
正好完美匹配了「以周一为一周起始日」的排序逻辑——周一排在最前面,周日排在最后面。
顺便提一句,这是个很巧妙的小技巧,利用了数字大小的比较逻辑来调整排序顺序,相比一些更复杂的数学计算(比如取模运算),写法更简洁直观。
内容的提问来源于stack exchange,提问作者Model Naoe
相关产品推荐
相关产品推荐

