如果我有一个日期01/01/2009,我想知道它是哪一天,例如星期一,星期二,等等。

在SQL Server 2005/2008中有内置函数吗?或者我需要使用辅助桌吗?


当前回答

使用DATENAME或DATEPART:

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6

其他回答

使用DATENAME或DATEPART:

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6

您可能会发现这个版本用于在一行中返回缩短的工作日名称。

-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA

select  Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
        (DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
        from #test 

另外,以上所有答案中,dw代表Week Day

SELECT DATENAME(WEEKDAY,GETDATE()) AS WeekDay

or

SELECT DATENAME(W,GETDATE()) AS WeekDay

要获得给定日期的星期几的确定值,可以使用DATEPART()和@@datefirst的组合。否则你将依赖于服务器上的设置。

请访问以下网站寻找更好的解决方案: MS SQL:星期的一天

然后,星期几将在0到6的范围内,其中0是星期天,1是星期一,等等。然后可以使用简单的case语句返回正确的工作日名称。

您可以使用DATEPART(dw, GETDATE()),但请注意,结果将依赖于SQL服务器设置@@DATEFIRST值,这是一周的第一天设置(在欧洲默认值7,这是星期天)。

如果你想将一周的第一天更改为另一个值,你可以使用SET DATEFIRST,但这可能会影响到你不想要的查询会话中的所有地方。

另一种方法是显式地指定一周的第一天值作为参数,并避免依赖于@@DATEFIRST设置。当需要时,你可以使用下面的公式来实现:

(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1

@WeekStartDay是你的系统想要的一周的第一天(从1到7,这意味着从周一到周日)。

我把它包装成下面的函数,这样我们可以很容易地重用它:

CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
    --Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
    RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1 
END

使用示例: GetDayInWeek('2019-02-04 00:00:00', 1)

它等价于以下(但独立于SQL server DATEFIRST设置):

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')