如果日期是工作日或周末,则显示SQL Server过程

问题描述 投票:0回答:3

在SQL中乱七八糟,我非常新,请原谅我的新鲜感。我创建了一个程序,接受日期作为输入并打印原稿,一年后,一周后和一天后。现在我想告诉我这些日期是平日或周末的输出。我从'谷歌搜索'知道它可能与DATETIMEDATENAME有关。希望得到你们的一些指导。谢谢!

CREATE PROCEDURE dates 
AS
BEGIN
    DECLARE @startdate SMALLDATETIME;
    DECLARE @dateafteryear VARCHAR(50);
    DECLARE @weekafter VARCHAR(50);
    DECLARE @daylater VARCHAR(50);

    SET @startdate = GETDATE();
    SET @dateafteryear = DATEADD(YYYY, 1, @startdate)
    SET @weekafter = DATEADD(WEEK, 1, @startdate)
    SET @daylater = DATEADD(DAY, 1, @startdate)

    PRINT 'Original Date ' + CAST(@startdate AS VARCHAR);
    PRINT 'A year later ' + CAST(@dateafteryear AS VARCHAR);
    PRINT 'A week later ' + CAST(@weekafter AS VARCHAR);
    PRINT 'A day later ' + CAST(@daylater AS VARCHAR);
END
GO

EXEC dates;

输出:

Original date Jan 12 2015 4:47PM, **is a Weekday.**
A year later Jan 12 2016 4:47PM, **is a Weekday.**
A week later Jan 19 2015 4:47PM, **is a Weekday.**
A day later Sep 17 2018 4:50 PM, **is a Weekday.**
sql sql-server
3个回答
2
投票

在SQL Server中使用DATEPART(标准SQL中的EXTRACT)和weekday参数(可以缩写为dw)。请注意,weekdaydw都是语言关键字而不是字符串值,如下所示:DATEPART( weekday, @startDate )

此函数将int值从1返回到对应于星期几的7。请注意,实际的日期到数字映射取决于您的DATEFIRST上下文值,因为在美国星期日是一周的第一天(1 =星期日),但在世界大部分时间是星期一(1 =星期一)。我建议你在调用SET DATEFIRST之前用你想要的值指定DATEPART( weekday, ... )

因此,要判断某个日期是否是周末,请执行以下操作:

SET DATEFIRST 1 -- Specify 1 = Monday, 2 = Tuesday, ..., 7 = Sunday

CASE DATEPART( dw, @startdate )
    WHEN 6 THEN PRINT 'Saturday'
    WHEN 7 THEN PRINT 'Sunday'
    ELSE PRINT 'Weekday'
END

文档:


1
投票

我确信这是一个思想实验,但我从未在PRINT中看到太多价值。我也看到了很多重复。

也许是简洁的论据。 :)

DECLARE @startdate SMALLDATETIME;
SET @startdate = GETDATE();

Select comment = Concat(prefix,dt,'. *** is a ',case when DateName(WEEKDAY,dt) in ('Saturday','Sunday') then 'Weekend' else 'Weekday' end,'.**')
 From  ( values ( @startdate                  ,'Original Date ')
               ,( DateAdd(YEAR, 1, @startdate),'A Year Later ' )
               ,( DateAdd(WEEK, 1, @startdate),'A Week Later ' )
               ,( DateAdd(DAY , 1, @startdate),'A day later '  )
       ) A (dt,prefix)

返回

comment
Original Date Sep 16 2018  4:55PM. *** is a Weekend.**
A Year Later Sep 16 2019  4:55PM. *** is a Weekday.**
A Week Later Sep 23 2018  4:55PM. *** is a Weekend.**
A day later Sep 17 2018  4:55PM. *** is a Weekday.**

只是为了好玩,如果你真的想打印

DECLARE @startdate SMALLDATETIME;
SET @startdate = GETDATE();

Declare @Print varchar(max) = (
Select Concat(prefix,dt,'. *** is a ',case when DateName(WEEKDAY,dt) in ('Saturday','Sunday') then 'Weekend' else 'Weekday' end,'.**',char(10))
 From  ( values ( @startdate                  ,'Original Date ')
               ,( DateAdd(YEAR, 1, @startdate),'A Year Later ' )
               ,( DateAdd(WEEK, 1, @startdate),'A Week Later ' )
               ,( DateAdd(DAY , 1, @startdate),'A day later '  )
       ) A (dt,prefix)
 For XML Path('')
)
Print @Print

0
投票

我会使用DATEPART函数与CASE WHEN来检查工作日或周末的一天。

  • Saturday = 1
  • Sunday = 2

我会写一个函数WeekDayOrWeekEnd来检查这一天。

CREATE FUNCTION [dbo].WeekDayOrWeekEnd (@input datetime)
RETURNS VARCHAR(250)
AS BEGIN
    DECLARE @Result VARCHAR(250)

    SET @Result =CASE WHEN DATEPART(dw,@input) IN (1,2) THEN 'Weekend' ELSE 'Weekday' END
    RETURN @Result
END

你的程序可以使用

CREATE PROCEDURE dates 
AS
BEGIN
    DECLARE @startdate smalldatetime;
    DECLARE @dateafteryear smalldatetime;
    DECLARE @weekafter smalldatetime;
    DECLARE @daylater smalldatetime;

    SET @startdate = getdate();
    SET @dateafteryear = DATEADD(YYYY,1,@startdate)
    SET @weekafter = DATEADD(week,1,@startdate)
    SET @daylater = DATEADD(day,1,@startdate)

    print 'Original Date ' + CAST(@startdate AS VARCHAR)+' is a '+ [dbo].WeekDayOrWeekEnd(@startdate)
    print 'A year later ' + CAST(@dateafteryear AS VARCHAR)+' is a '+ [dbo].WeekDayOrWeekEnd(@dateafteryear)
    print 'A week later ' + CAST(@weekafter AS VARCHAR)+' is a '+ [dbo].WeekDayOrWeekEnd(@weekafter)
    print 'A day later ' + CAST(@daylater AS VARCHAR) +' is a '+ [dbo].WeekDayOrWeekEnd(@daylater)

END

sqlfiddle

© www.soinside.com 2019 - 2024. All rights reserved.