Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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
Sql 季度日期计算_Sql_Sql Server 2008 - Fatal编程技术网

Sql 季度日期计算

Sql 季度日期计算,sql,sql-server-2008,Sql,Sql Server 2008,我在每个季度最后一个月的第一天安排工作时遇到问题。 这将是非常容易的,因为我可以得到每个季度的最后一个月,然后像这样附加第一个日期 select START_DATE, CONVERT(datetime,CAST(YEAR(START_DATE) as VARCHAR(4))+'/'+ CAST(DATEPART(Q,START_DATE)*3 as VARCHAR(2))+'/01 00:00:00',120 ) as SCHEDULE_DATE

我在每个季度最后一个月的第一天安排工作时遇到问题。 这将是非常容易的,因为我可以得到每个季度的最后一个月,然后像这样附加第一个日期

select START_DATE,
CONVERT(datetime,CAST(YEAR(START_DATE) as VARCHAR(4))+'/'+
                 CAST(DATEPART(Q,START_DATE)*3 as VARCHAR(2))+'/01 00:00:00',120
       ) as SCHEDULE_DATE_LAST_MONTH_OF_QUARTER
from JOB_SCHEDULE_CONFIGURATION
绊脚石是开始日期。我将举例说明

START_DATE SCHEDULE_DATE_LAST_MONTH_OF_QUARTER
2012/05/01 2012/06/01 --correct schedule
2012/02/15 2012/03/01 --correct schedule
2012/06/15 2012/06/01 ---problem at this line I will explain why
开始日期正好是2012/06/15,我无法在开始日期(即2012/06/01)之前安排工作。我只能在2012/06/15之后安排,这意味着工作应该安排在下一个季度,即2012/09/01

如何修改查询?我想可能会涉及到一些数学问题,而我在数学方面真的不擅长。 请帮忙

谢谢

大卫

更新:

此查询的主要部分是获取季度的第一个日期,这是通过dateadd/datediff技巧完成的

select dateadd(quarter, datedifF(quarter, 0, START_DATE), 0)
from @T
结果:

-----------------------
2012-04-01 00:00:00.000
2012-01-01 00:00:00.000
2012-04-01 00:00:00.000
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-06-01 00:00:00.000
----------
2012-05-01
2012-03-15
2012-07-15
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-09-01 00:00:00.000
您想要季度的最后一个月,因此我们添加了一个
dateadd(月,2

select dateadd(month, 2, dateadd(quarter, datedifF(quarter, 0, START_DATE), 0))
from @T
结果:

-----------------------
2012-04-01 00:00:00.000
2012-01-01 00:00:00.000
2012-04-01 00:00:00.000
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-06-01 00:00:00.000
----------
2012-05-01
2012-03-15
2012-07-15
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-09-01 00:00:00.000
这只剩下上个月15日之后的日期应该在下个季度末的部分。
day(START\u DATE)
将为您提供一个月的日期,因此,如果
day(START\u DATE)>=15,我们可以使用案例说明为START\u DATE添加1个月

select dateadd(month, case when day(START_DATE) >= 15 then 1 else 0 end, START_DATE)
from @T
结果:

-----------------------
2012-04-01 00:00:00.000
2012-01-01 00:00:00.000
2012-04-01 00:00:00.000
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-06-01 00:00:00.000
----------
2012-05-01
2012-03-15
2012-07-15
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-09-01 00:00:00.000
把所有这些放在一起,看起来是这样的

select dateadd(month, 2, dateadd(quarter, datedifF(quarter, 0, dateadd(month, case when day(START_DATE) >= 15 then 1 else 0 end, START_DATE)), 0))
from @T
结果:

-----------------------
2012-04-01 00:00:00.000
2012-01-01 00:00:00.000
2012-04-01 00:00:00.000
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-06-01 00:00:00.000
----------
2012-05-01
2012-03-15
2012-07-15
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-09-01 00:00:00.000

请您解释一下查询背后的逻辑。Thank PS START_DATE可以是从1日到31日的任何日期。它不必是15。Thank Mikael。明白了。Super。感谢查询和详细解释。对于开始日期为每月2日到14日(例如“2012-06-14”)的作业,它不应该是>=1而不是>=15吗它不会在下个季度显示。@Ivan_uu83-你可能是对的,我可能看错了问题。看起来
15
只是一个示例日期,而不是临界点。无论如何,你的解决方案会解决这个问题。这只是一个小问题,你的解决方案真的很好而且是最优的。