在SQL中乱七八糟,我非常新,请原谅我的新鲜感。我创建了一个程序,接受日期作为输入并打印原稿,一年后,一周后和一天后。现在我想告诉我这些日期是平日或周末的输出。我从'谷歌搜索'知道它可能与DATETIME
或DATENAME
有关。希望得到你们的一些指导。谢谢!
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 Server中使用DATEPART
(标准SQL中的EXTRACT
)和weekday
参数(可以缩写为dw
)。请注意,weekday
和dw
都是语言关键字而不是字符串值,如下所示: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
文档:
我确信这是一个思想实验,但我从未在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
我会使用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