SQL查询帮助:以非平凡的方式转换日期

时间:2008-09-19 18:29:01

标签: sql sql-server date sql-server-2000 dateadd

我有一个带有“日期”列的表,我想执行以下操作的查询:

如果日期为星期一星期二星期三星期四,则显示的日期应为向上移动了1天,如

DATEADD(day, 1, [Date])
另一方面,如果是星期五,则显示的日期应增加3天(即因此它变为在星期一之后。

我如何在SELECT语句中执行此操作?如,

SELECT somewayofdoingthis([Date]) FROM myTable

(这是SQL Server 2000。)

12 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

答案 2 :(得分: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] 

答案 3 :(得分:2)

我假设你也希望星期六和星期日转到下一个星期一。如果不是这种情况,请取出(1,2,3,4,5)中的1并删除最后一个句子。

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

答案 4 :(得分:1)

听起来像一个CASE表达式。我不知道SQL Server的正确数据操作,但基本上它看起来像这样:

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

如果您想查看周末日,可以在ELSE之前添加其他WHEN条款。

答案 5 :(得分: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
    ...

答案 6 :(得分: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

答案 7 :(得分:1)

查找CASE语句和DATEPART语句。您将需要使用带DATEPART的dw参数来获取表示星期几的整数。

答案 8 :(得分:1)

如何从Data Warehouse人那里取一页并制作一张桌子。在DW术语中,这将是日期维度。 standard date dimension会有日期(“MON”,“星期一”,“1998年8月22日”)的各种名称,或者月末和月初的指标。但是,您也可以使用仅在您的环境中有意义的列。

例如,根据这个问题,您的下一个工作日列可能会指向相关日期的关键字。这样您就可以进一步自定义它以考虑假期或其他非工作日。

DW人员坚持使用无意义的键(也就是说,不要只使用截断日期作为键,使用生成的键),但您可以自己决定。

Date Dimension Toolkit具有在各种DBMS中生成您自己的表的代码,并且它具有几年的日期CSV数据。

答案 9 :(得分:0)

您需要创建一个为您执行此转换的SQL函数。

答案 10 :(得分:0)

这大部分都像Brian一样,但由于不匹配的parens而没有编译,我改变了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

答案 11 :(得分:-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