3

「日付」列を含むテーブルがあり、次のようなクエリを実行したいと考えています。

日付が月曜日火曜日水曜日、または木曜日の場合、次のように、表示される日付を 1 日ずらす必要があります。

DATEADD(日, 1, [日付])
一方、それが金曜日の場合、表示される日付は 3 日増加する必要があります (つまり、次の月曜日になります)。

SELECT ステートメントでこれを行うにはどうすればよいですか? のように、

myTable から somewayofdoingthis([Date]) を選択

(これは SQL Server 2000 です。)

4

12 に答える 12

5

これが私がそれを行う方法です。他の場所でこれを使用する場合は、上記のような機能をお勧めします。

CASE
WHEN
    DATEPART(dw, [Date]) IN (2,3,4,5)
THEN
    DATEADD(d, 1, [Date])
WHEN
    DATEPART(dw, [Date]) = 6
THEN
    DATEADD(d, 3, [Date])
ELSE
    [Date]
END AS [ConvertedDate]
于 2008-09-19T18:36:54.653 に答える
4
CREATE FUNCTION dbo.GetNextWDay(@Day datetime)
RETURNS DATETIME
AS
BEGIN 
    DECLARE @ReturnDate DateTime

    set @ReturnDate = dateadd(dd, 1, @Day)

    if (select datename(@ReturnDate))) = 'Saturday'
        set @ReturnDate = dateadd(dd, 2, @ReturnDate)

    if (select datename(@ReturnDate) = 'Sunday'
        set @ReturnDate = dateadd(dd, 1, @ReturnDate)

    RETURN @ReturnDate
END
于 2008-09-19T18:37:33.980 に答える
2

試す

select case  when datepart(dw,[Date]) between 2 and 5 then DATEADD(dd, 1, [Date])
when datepart(dw,[Date]) = 6 then DATEADD(dd, 3, [Date]) else [Date] end as [Date] 
于 2008-09-19T18:38:25.383 に答える
2

また、土曜日と日曜日を次の月曜日にシフトすることも想定しています。そうでない場合は、(1,2,3,4,5) から 1 を取り出し、最後の when 句を削除します。

case
   --Sunday thru Thursday are shifted forward 1 day
   when datepart(weekday, [Date]) in (1,2,3,4,5) then dateadd(day, 1, [Date]) 
   --Friday is shifted forward to Monday
   when datepart(weekday, [Date]) = 6  then dateadd(day, 3, [Date])
   --Saturday is shifted forward to Monday
   when datepart(weekday, [Date]) = 7  then dateadd(day, 2, [Date])
end

1 行で実行することもできます。

select dateadd(day, 1 + (datepart(weekday, [Date])/6) * (8-datepart(weekday, [Date])), [Date])
于 2008-09-19T18:46:13.307 に答える
1

データウェアハウスの人たちからページを取り、テーブルを作ってみませんか。DW用語では、これは日付ディメンションになります。標準の日付ディメンションには、日付のさまざまな名前( "MON"、 "Monday"、 "1998年8月22日")、または月末や月の初めなどのインジケーターが含まれます。ただし、ご使用の環境でのみ意味のある列を作成することもできます。

たとえば、質問に基づいて、問題の日のキーを指す翌営業日の列がある場合があります。そうすれば、休日やその他の休業日を考慮して、さらにカスタマイズすることができます。

DWの人々は、意味のないキーを使用することに固執しています(つまり、キーとして切り捨てられた日付を使用するのではなく、生成されたキーを使用します)が、それは自分で決めることができます。

Date Dimension Toolkitには、さまざまなDBMSで独自のテーブルを生成するコードがあり、数年分の日付のCSVデータがあります。

于 2008-09-19T20:07:50.113 に答える
1

CASE 式のように聞こえます。SQL Server の適切なデータ操作はわかりませんが、基本的には次のようになります。

CASE
  WHEN [Date] is a Friday THEN DATEADD( day, 3, [Date] )
  ELSE DATEADD( day, 1, [Date] )
END

週末をチェックしたい場合は、ELSE の前に WHEN 句を追加できます。

于 2008-09-19T18:34:22.897 に答える
1

これは私の頭の上から外れており、明らかにクリーンアップできますが、出発点として使用してください。

select case when DATENAME(dw, [date]) = 'Monday' then DATEADD(dw, 1, [Date])
                when DATENAME(dw, [date]) = 'Tuesday' then DATEADD(dw, 1, [Date])
                when DATENAME(dw, [date]) = 'Wednesday' then DATEADD(dw, 1, [Date])
                when DATENAME(dw, [date]) = 'Thursday' then DATEADD(dw, 1, [Date])
                when  DATENAME(dw, [date]) = 'Friday' then DATEADD(dw, 3, [Date])
          end as nextDay
    ...
于 2008-09-19T18:36:32.160 に答える
1

これを使用できます:

select dayname,newdayname =
    CASE dayname
    WHEN 'Monday' THEN 'Tuesday'
    WHEN 'Tuesday' THEN 'Wednesday'
    WHEN 'Wednesday' THEN 'Thursday'
    WHEN 'Thursday' THEN 'Friday'
    WHEN 'Friday' THEN 'Monday'
    WHEN 'Saturday' THEN 'Monday'
    WHEN 'Sunday' THEN 'Monday'
END
FROM UDO_DAYS
結果:
月曜日火曜日
火曜日水曜日
水曜日木曜日
木曜日金曜日
金曜日 月曜日
土曜日 月曜日
日曜日月曜日

テーブル データ:
月曜日
火曜日
水曜日
木曜日
金曜日
土曜日
日曜日
于 2008-09-19T18:36:51.003 に答える
1

CASE ステートメントと DATEPART ステートメントを調べます。曜日を表す整数を取得するには、DATEPART で dw 引数を使用する必要があります。

于 2008-09-19T18:38:04.167 に答える
0

この変換を行う SQL 関数を作成する必要があります。

于 2008-09-19T18:32:39.720 に答える
0

これは、かっこの不一致が原因でコンパイルされなかったことを除いて、Brian のものとほぼ同じです。ここでは、datePART ではなく DateNAME を使用していることに注意してください。datePART は、週の最初の曜日を設定する SET DATEFIRST によって設定された値に依存するためです。

CREATE FUNCTION dbo.GetNextWDay(@Day datetime)
RETURNS DATETIME
AS
BEGIN
    DECLARE @ReturnDate DateTime

    set @ReturnDate = dateadd(dd, 1, @Day)
    if datename(dw, @ReturnDate) = 'Saturday'
        set @ReturnDate = dateadd(dd, 2, @ReturnDate)
    if datename(dw, @ReturnDate) = 'Sunday'
        set @ReturnDate = dateadd(dd, 1, @ReturnDate)
    RETURN @ReturnDate
END
于 2008-09-19T20:00:03.223 に答える
-2
create table #dates (dt datetime)
insert into #dates (dt) values ('1/1/2001')
insert into #dates (dt) values ('1/2/2001')
insert into #dates (dt) values ('1/3/2001')
insert into #dates (dt) values ('1/4/2001')
insert into #dates (dt) values ('1/5/2001')

    select
        dt, day(dt), dateadd(dd,1,dt)
    from
        #dates
    where
        day(dt) between 1 and 4

    union all

    select
        dt, day(dt), dateadd(dd,3,dt)
    from
        #dates
    where
        day(dt) = 5

    drop table #dates
于 2008-09-19T18:42:17.777 に答える