sql周期函数

时间:2018-02-07 08:53:51

标签: oracle math

有一个SQL函数,日期为参数

f(p_date) = mod(to_char(p_date,'mm')+1,2)*39 + to_char(p_date,'dd')

f(p_date)的值重复2个月,即

f(Feb 7th) = 46 
f(Feb 8th) = 47
...
f(Apr 7th) = 46
...
f(Jun 7th) = 46
...

我不会在这里看到一个模式。为什么乘数等于39?这两个月来自哪里?

我需要的是最终的同类功能,但周期为40天(或1.5个月):

f(Feb 7th) = 46
..
f(Mar 19th) = 46
..
f(Apr 28th) = 46, etc

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

  

为什么乘数等于39?

模数表达式将在奇数月评估为0,在偶数月评估为1。乘以39为0或39.添加日期,函数将返回奇数月份的日期,以及偶数月份的39 +日期。

因此,

奇数(1月)
1,2,3,...,月末

甚至(2月)
40,41,42,... 39 +上个月的最后一次

  

这两个月的来源是什么?

2是modulus function(其除数)的参数。模数函数将为输入1,2,3,4,5 ......返回序列1,0,1,0,1 ...等等。数学上的余数。它用于创建奇数/偶数周期。

答案 1 :(得分:1)

@AlexeyKryuchkov,你能否提供更多关于你想要实现的目标的背景知识以及为什么?

1.5个月未映射到40天(或任何固定天数)。

如果您正在尝试定义“40天的月份”,最简单的解决方案是将日期转换为绝对日期,然后将模型转换为40.

我最近写了一篇关于使用日历的复杂性的Q& A:https://stackoverflow.com/a/48611348/9129668

调整该答案中的一些代码(基于SQL Server,而不是Oracle),您可能正在寻找的功能如下:

((((DATEDIFF(DD, CONVERT(DATETIME2(0),'0001-01-01',102), p_date) + 1) - 1) % 40) + 1) AS day_of_40_day_mth

但如果你再给我一些解释,我可能会更具体。