4

Bの値を入力すると、月のB番目の稼働日を取得する必要があります。たとえば、2013年1月のb = 12の場合、結果はその月の土曜日、日曜日、祝日を除外して計算されるため、「17-01-2013」の日付形式である必要があります。

次のコードを使用してSQLserverで試してみましたが、一部の関数はSqlserverのように使用できないため、MySqlで実行するのは困難です。

    Declare 
@fromDate Date,
@Daydiff int

Set @fromDate ='01 jan 2013'

Set @Daydiff=datediff(day, @fromdate, dateadd(month, 1, @fromdate))
Select * from 
(
Select 
    dateadd(day,DayNo,@fromDate) as Date,
    dateName(weekday,(dateadd(day,DayNo,@fromDate))) As WeekDate,
    Datename(month,(dateadd(day,DayNo,@fromDate))) as MonthName,
    Row_number() Over (partition by (DatePart(month,(dateadd(day,DayNo,@fromDate)))) 
    order by (dateadd(day,DayNo,@fromDate))) as Business_day
from 
    (Select top (@Daydiff) row_number() over(order by (select 1))-1 as DayNo 
     from sys.syscolumns a cross join sys.syscolumns b)Dates
Where
    dateName(weekday,(dateadd(day,DayNo,@fromDate))) Not In ('Saturday','Sunday') and
    dateadd(day,DayNo,@fromDate) Not In (Select hdate from Holidays)
)A
Where Business_day=1

ノート

Holidaysは、2013年の休日のリストを含む静的な休日テーブルです。

Mysqlに同様のインスタンスが必要です。親切にこれを手伝ってください。

4

2 に答える 2

2

SQLFiddleデモ

初日が必要な場合は、最後にOFFSET0を設定してください。2番目のオフセット1の場合、15番目のオフセットの場合14

select d
FROM
(
SELECT @row := @row + 1 as row,
 DATE_ADD('2013-01-01', INTERVAL @row-1 DAY) d
from
(SELECT @row := 0) r,
(
select 1 n
union all 
select 2 n
union all 
select 3 n
union all 
select 4 n
union all 
select 5 n
union all 
select 6 n
) t1,
(
select 1 n
union all 
select 2 n
union all 
select 3 n
union all 
select 4 n
union all 
select 5 n
union all 
select 6 n
) t2
) num_seq

where 
d<DATE_ADD('2013-01-01', INTERVAL 1 MONTH)
and d not in (select hdate from Holidays )
and DAYNAME(d) not in ('Saturday','Sunday')
order by d
LIMIT 1 OFFSET 20

OFFSETとLIMITのないバージョン。where r=11日目ですので最新情報をご覧ください。15日目の変更が必要な場合はwhere r=15

SQLFiddleデモ

select d
from
(
select d,@r := @r + 1 as r
FROM
(SELECT @r := 0) r1,
(
SELECT @row := @row + 1 as row,
 DATE_ADD('2013-01-01', INTERVAL @row-1 DAY) d
from
(SELECT @row := 0) r,
(
select 1 n
union all 
select 2 n
union all 
select 3 n
union all 
select 4 n
union all 
select 5 n
union all 
select 6 n
) t1,
(
select 1 n
union all 
select 2 n
union all 
select 3 n
union all 
select 4 n
union all 
select 5 n
union all 
select 6 n
) t2
) num_seq

where 
d<DATE_ADD('2013-01-01', INTERVAL 1 MONTH)
and d not in (select hdate from Holidays )
and DAYNAME(d) not in ('Saturday','Sunday')
order by d
) rTable
where r=1
于 2013-01-21T08:45:31.720 に答える
1

月と年のみがパラメーターとして渡されたときに同じ結果を取得する方法。コードをチェックしたときのCoz...日付がそれぞれの月の1日である場合は機能します。たとえば、パラメータを「2013-01-01」と入力した場合、結果は絶対になりますが、日付が「2013-01」と指定された場合-15'手順では、1日目15日をカウントし、そこからn日目を計算します。

于 2013-01-24T06:22:33.713 に答える