我有一個「日期」列的表,我願做一個查詢,執行以下操作:SQL查詢幫助:轉換日期在一個不平凡的路
如果日期是星期一,週二,週三,或週四,顯示的日期應該在1天
DATEADD(day, 1, [Date])上移,如在另一方面,如果它是一個 週五,顯示的日期應該由3遞增天(即所以它變成以下 星期一)。
如何在我的SELECT語句中執行此操作?如,
SELECT somewayofdoingthis([Date]) FROM myTable
(這是SQL Server 2000中)
我有一個「日期」列的表,我願做一個查詢,執行以下操作:SQL查詢幫助:轉換日期在一個不平凡的路
如果日期是星期一,週二,週三,或週四,顯示的日期應該在1天
DATEADD(day, 1, [Date])上移,如在另一方面,如果它是一個 週五,顯示的日期應該由3遞增天(即所以它變成以下 星期一)。
如何在我的SELECT語句中執行此操作?如,
SELECT somewayofdoingthis([Date]) FROM myTable
(這是SQL Server 2000中)
這裏我該怎麼做。如果您將在其他地方使用此功能,我建議您使用上述功能。
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]
你需要創建一個SQL函數,它這種轉變你。
聽起來像一個CASE表達式。我不知道SQL Server的正確數據操作,但基本上是這樣的:
CASE
WHEN [Date] is a Friday THEN DATEADD(day, 3, [Date])
ELSE DATEADD(day, 1, [Date])
END
如果你想檢查週末兩天,你可以添加額外的WHEN子句的東西之前。
這是把我的頭頂部,可以清楚地清理,但是用它作爲一個起點:
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
...
,你可以這樣做:
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
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
查找CASE語句和DATEPART聲明。您將希望在DATEPART中使用dw參數來獲取表示星期幾的整數。
嘗試
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]
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
我假設你也想週六和週日向前移動到下一個星期一。如果不是這種情況,請從(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])
這主要是像布萊恩的,除了它沒有編譯由於不匹配的括號和我改變了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
如何從Data Warehouse傢伙的頁面,並創建一個表。在DW中,這將是一個日期維度。一個standard date dimension會有像日期(「星期一」,「星期一」,「1998年8月22日」)的各種名稱,或像月末和月初等指標。但是,您也可以擁有僅在您的環境中有意義的列。
例如,根據問題,您可能會有下一個工作日的專欄,指向相關日期的關鍵字。這樣,您可以進一步對其進行自定義,以考慮假期或其他非工作日。
DW人堅決使用無意義的鍵(也就是說,不要只使用截斷日期作爲鍵,使用生成的鍵),但是您可以自己決定。
Date Dimension Toolkit有代碼可以在各種DBMS中生成您自己的表格,並且它具有幾年的日期CSV數據。
週六和週日會發生什麼? – brian 2008-09-19 20:59:37
沒關係。 – Jake 2008-09-19 23:22:33