2008-09-19 36 views
3

我有一個「日期」列的表,我願做一個查詢,執行以下操作:SQL查詢幫助:轉換日期在一個不平凡的路

如果日期是星期一週二週三,或週四,顯示的日期應該在1天

DATEADD(day, 1, [Date])
上移,如在另一方面,如果它是一個 週五,顯示的日期應該由3遞增天(即所以它變成以下 星期一)。

如何在我的SELECT語句中執行此操作?如,

SELECT somewayofdoingthis([Date]) FROM myTable

(這是SQL Server 2000中)

+0

週六和週日會發生什麼? – brian 2008-09-19 20:59:37

+0

沒關係。 – Jake 2008-09-19 23:22:33

回答

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] 
0

你需要創建一個SQL函數,它這種轉變你。

1

聽起來像一個CASE表達式。我不知道SQL Server的正確數據操作,但基本上是這樣的:

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

如果你想檢查週末兩天,你可以添加額外的WHEN子句的東西之前。

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

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

查找CASE語句和DATEPART聲明。您將希望在DATEPART中使用dw參數來獲取表示星期幾的整數。

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] 
-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 
2

我假設你也想週六和週日向前移動到下一個星期一。如果不是這種情況,請從(1,2,3,4,5)中取出1,並刪除last 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 

你也可以做一個行:

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

這主要是像布萊恩的,除了它沒有編譯由於不匹配的括號和我改變了IF不具有在選擇它。需要注意的是,我們在此處使用DateNAME而不是datePART,因爲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 
1

如何從Data Warehouse傢伙的頁面,並創建一個表。在DW中,這將是一個日期維度。一個standard date dimension會有像日期(「星期一」,「星期一」,「1998年8月22日」)的各種名稱,或像月末和月初等指標。但是,您也可以擁有僅在您的環境中有意義的列。

例如,根據問題,您可能會有下一個工作日的專欄,指向相關日期的關鍵字。這樣,您可以進一步對其進行自定義,以考慮假期或其他非工作日。

DW人堅決使用無意義的鍵(也就是說,不要只使用截斷日期作爲鍵,使用生成的鍵),但是您可以自己決定。

Date Dimension Toolkit有代碼可以在各種DBMS中生成您自己的表格,並且它具有幾年的日期CSV數據。