3

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

如果日期是MondayTuesdayWednesdayThursday,则显示的日期应上移 1 天,如

DATEADD(天,1,[日期])
另一方面,如果是Friday,则显示的日期应增加 3 天(即变为下一个Monday)。

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

SELECT somewayofdoingthis([Date]) FROM myTable

(这是 SQL Server 2000。)

4

12 回答 12

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]
于 2008-09-19T18:36:54.653 回答
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
于 2008-09-19T18:37:33.980 回答
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] 
于 2008-09-19T18:38:25.383 回答
2

我假设您还希望周六和周日提前到下周一。如果不是这种情况,请从 (1,2,3,4,5) 中取出 1 并删除最后一个 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])
于 2008-09-19T18:46:13.307 回答
1

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

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

如果您想检查周末,您可以在 ELSE 之前添加额外的 WHEN 子句。

于 2008-09-19T18:34:22.897 回答
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
    ...
于 2008-09-19T18:36:32.160 回答
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
结果:
星期一星期二
周二周三
星期三星期四
星期四星期五
周五 周一
星期六 星期一
星期天星期一

表数据:
周一
周二
周三
周四
星期五
周六
星期日
于 2008-09-19T18:36:51.003 回答
1

查找 CASE 语句和 DATEPART 语句。您将希望将 dw 参数与 DATEPART 一起使用以获取表示星期几的整数。

于 2008-09-19T18:38:04.167 回答
1

如何从数据仓库的人那里获取一页并制作一张表格。在 DW 术语中,这将是一个日期维度。一个标准的日期维度将包含诸如日期的各种名称(“MON”、“Monday”、“1998 年 8 月 22 日”)或诸如月末和月初的指标之类的东西。但是,您也可以拥有仅在您的环境中有意义的列。

例如,根据问题,您的问题可能有一个 next-work-day 列,该列将指向相关日期的键。这样,您可以进一步自定义它以考虑假期或其他非工作日。

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

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

于 2008-09-19T20:07:50.113 回答
0

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

于 2008-09-19T18:32:39.720 回答
0

这很像 Brian 的,只是由于括号不匹配而没有编译,我将 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
于 2008-09-19T20:00:03.223 回答
-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
于 2008-09-19T18:42:17.777 回答