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/06/15 で、開始日 (2012/06/01) より前にジョブをスケジュールできません。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 日より後の日付が次の四半期の終わりになる部分だけが残ります。case ステートメントを使用している場合は、day(START_DATE)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

結果:

-----------------------
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 に答える