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

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

DATEADD(day, 1, [Date])
另一方面,如果是星期五,显示的日期应增加3天(即所以它变为以下< EM>周一)。

我如何在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]

其他提示

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

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

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

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

你可以用这个:

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

查找CASE语句和DATEPART语句。您将需要使用带DATEPART的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术语中,这将是日期维度。 标准日期维度将具有诸如日期的各种名称之类的内容(“MON”,“星期一“,”1998年8月22日“),或月末和月初的指标。但是,您也可以使用仅在您的环境中有意义的列。

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

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

日期维度工具包包含在各种DBMS中生成您自己的表格的代码,它具有CSV数年的数据。

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

这大部分都像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
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