문제

나는 테이블과 함께"Date"열,그리고 이외에 도전해보고 싶 쿼리에는 다음과 같은 작업을 수행합니다.

면 날짜가 월요일, 화요일, 수요일, 나 목요일, 표시된 날짜 이동해야 1 일에서와 같이,

DATEADD(day, 1, [Date])
다른 한편으로는 경우,그것은 금요일, 표시된 날짜이어야 증가에 의해 3 일 동안(즉그래서 그것은 다음 월요일).

어떻게 이렇게 나에서 선택할 수 있을까?으로서,

SELECT somewayofdoingthis([Date]) FROM myTable

(이것은 SQL Server2000.)

도움이 되었습니까?

해결책

여기에는 방법이다 나는 그것을 할 것입니다.내가 권능과 같은 위를 사용하는 경우 이에서 다른 장소입니다.

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]

다른 팁

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

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] 

나는 가정으로 당신은 또한 토요일과 일요일을 앞으로 이동하는 다음과 같은 월요일입니다.면하지 않는 경우,을 1(1,2,3,4,5)고 제거하면 마지막 절입니다.

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

또한 그것을 할 수 있습니에서 하나인:

select dateadd(day, 1 + (datepart(weekday, [Date])/6) * (8-datepart(weekday, [Date])), [Date])

같은 소리를 경우 표현이다.나도 몰라 적절한 데이터를 조작에 대한 SQL Server,그러나 기본적으로 다음과 같이 보일 것입니다.

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

하고 싶다면 확인에 대한 주말에 일을 추가할 수 있습니다 추가할 때 절기 전에 다른입니다.

를 사용할 수 있습니다:

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
results:
Monday       Tuesday
Tuesday      Wednesday
Wednesday    Thursday
Thursday     Friday
Friday       Monday
Saturday     Monday
Sunday       Monday

table data:
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

찾아의 경우 성명 및 부분을 문입니다.당신이 사용하고 싶을 것이 dw 인수 부분을 다시 얻을 수있는 정수를 나타내는 날의 주입니다.

이는 내 머리 위로할 수 있습 명확하게 정리지만 사용으로 시작하는 포인트:

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
    ...

는 방법에 대해서 페이지 데이터 웨어하우스 남자와 테이블을 확인합니다.에 DW 조건이 될 것 이라고 날짜 차원이다.A 표준 날짜 치수 것과 같은 것들이 다양한 이름 날짜를("MON","화요일","August22,1998"),또는 지표를 같이 end-of-month 과 시작-of-month.그러나,있을 수도 있습는 열에만 의미에서의 환경입니다.

예를 들어,질문에 따라,당신 수 있음-일 일 열을 가리킨 것이 열쇠를 위해 하루에 질문입니다.는 방법으로 사용자 정의할 수도 있습니다 추가 계정에 또 다른 비니다.

DW 사람들에 대한 확고한 의지를 가지고 사용하는 의미 없는 키(즉,이용하지 않는 절단된 날짜 키로 사용하여 생성된 열쇠),하지만 당신은 결정할 수 있습니다.

날짜 차원 Toolkit 는 코드를 생성하는 당신의 자신의 테이블에서 다양한 DBMS 과는 데 몇 년 동안 가치가 있습니다.

을 만들어야 합 SQL 함수는 이러한 변화에 대한 당신.

이 같은 대부분 브라이언은 제외지 않은 컴파일 때문에 일치하지 않는 괄호하고 변경하는 경우가 있지 않을 선택합니다.중요한 점은 우리가 사용하는 DateNAME 여기 보다는 오히려 부분기 부분 의존에 설정된 값으로 설정 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
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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top