Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle sql周期函数_Oracle_Math - Fatal编程技术网

Oracle sql周期函数

Oracle sql周期函数,oracle,math,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个月):

有一个以日期为参数的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个月):

谢谢你的帮助

为什么乘数等于39

对于奇数月,模表达式的计算结果为0,对于偶数月,模表达式的计算结果为1。这乘以39等于0或39。添加日期后,该函数将返回奇数月的日期,并返回偶数月的39+天

因此,

奇数(一月)
1,2,3,…,最后一个月

甚至(二月)
40, 41, 42, ... 39个月的最后一个月

这两个月是从哪里来的


2是(其除数)的参数。模函数将返回序列1,0,1,0,1。。。对于输入1、2、3、4、5。。。等等从数学上讲,余数是零。它用于创建奇偶周期。

@AlexeyKryuchkov,你能提供更多关于你想要实现什么以及为什么的背景信息吗

1.5个月不等于40天(或任何固定天数)

如果你想定义一个“40天月”,最简单的解决方法是将一个日期转换成一个绝对日期,然后按40修改

我最近写了一篇关于使用日历的复杂性的问答:

根据答案中的一些代码(基于SQL Server,而非Oracle),您可能需要的功能如下:

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

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

数学是
((月+1)%2)*39+天
,所以它的作用是从每个奇数月开始,39+1=40,而每隔一个月通常从第一天算到最后一个月。你在使用哪种产品?博士后?神谕“SQL”只是一种查询语言,不是特定数据库产品的名称。是的,乘数39必须大于月最大天数=31,只是不能重叠。奇数/偶数是否意味着不可能使用该函数实现3个月或1.5个月的周期性?该公式可以调整为任何周期性和偏移量。请在问题中添加有关预期输出的更多信息。我需要每40天重复一次输出。因此,f(p_日期)的范围为[1..40]。例如,f(今天)=1,f(今天+1)=2,…,f(今天+40)=1,f(今天+41)=2,…,那么原始公式中存在的间隙呢?当f(2018年2月28日)为28时,你会认为f(2018年1月3日)为29吗?好的,从一开始。我在Oracle中有一个名为CS_LOG的表,它应该只以“循环”方式存储最近两个月的数据。该表在字段CS_PAR上有一个列表分区,共有62个段:按列表分区(“CS_PAR”)分区“P_CS_LOG_01”值(1)分区“P_CS_LOG_02”值(2)。。。分区“P_CS_LOG_31”值(31)分区“P_CS_LOG_40”值(40)。。。分区“P_CS_LOG_71”值(71)CS_LOG的每个分区P_CS_LOG#包含某一天的数据。每10分钟从另一个表复制一次新数据,并以mod(to_char(P_date,'mm')+1,2)*39)+to_char(P_date,'dd')添加到分区,其中P_date是时间戳“current_day+hh:mm”。一天一次,一个作业会用最旧的数据截断分区P_CS_LOG#,也就是说,它的数字被计算为mod(to_char(sysdate+1,'mm')+1,2)*39)+to_char(sysdate+1,'dd')。我想要实现的是只存储最近40天的数据,而不是2个月的数据。我假设应该有40个分区,公式需要相应调整,但由于数据的轮换是以“每月”的方式组织的,表中的分区数似乎应该是每月天数的倍数。如果我不太清楚,请感谢并道歉。如果您首先计算每个日志条目的年龄(以天为单位),并将其作为算法其余部分的输入,这将容易得多。我现在明白了。不需要坚持使用_char()来操纵日期。我的周期函数可以是mod(trunc((sysdate+i)-to_date('01.01.1970','DD.MM.YYYY')),40)+1,正如您所说。是的,概述一个解决方案就足够了。谢谢!
((((DATEDIFF(DD, CONVERT(DATETIME2(0),'0001-01-01',102), p_date) + 1) - 1) % 40) + 1) AS day_of_40_day_mth