我在每个季度的最后一个月的第一天调度作业时遇到问题。 这很容易,因为我可以获得每个季度的最后一个月,然后将第一个日期添加到它,如
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。我将举例说明
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
如何修改查询?我认为可能涉及一些数学,我真的不擅长数学。 请帮忙。
由于
大卫
答案 0 :(得分:2)
declare @T table
(
START_DATE date
)
insert into @T values
('2012-05-01'),
('2012-02-15'),
('2012-06-15')
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
<强>更新强>
此查询的主要部分是获取季度的第一个日期,这是通过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
您想要季度的最后一个月,因此我们添加dateadd(month, 2
select dateadd(month, 2, dateadd(quarter, datedifF(quarter, 0, START_DATE), 0))
from @T
结果:
-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-06-01 00:00:00.000
只留下比上个月15日晚的日期应该在下一季度末的部分。 day(START_DATE)
将为您提供该月的某一天,以便我们可以使用案例陈述{1}}在START_DATE添加1个月。
day(START_DATE) >= 15
结果:
select dateadd(month, case when day(START_DATE) >= 15 then 1 else 0 end, START_DATE)
from @T
将它们放在一起它看起来像这样。
----------
2012-05-01
2012-03-15
2012-07-15
结果:
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