1

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

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 年 6 月 15 日,我无法在开始日期之前安排工作,即 2012 年 6 月 1 日。我必须在 2012/06/15 之后安排它,这意味着该工作应该安排在下一个季度,即 2012/09/01

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

谢谢

大卫

4

1 回答 1

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)将为您提供月份中的某一天,因此如果day(START_DATE) >= 15使用案例语句,我们可以将 1 个月添加到 START_DATE。

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

结果:

-----------------------
2012-06-01 00:00:00.000
2012-03-01 00:00:00.000
2012-09-01 00:00:00.000
于 2012-06-08T05:25:06.983 回答