在SQL Server 2005/2008中获取星期几

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

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

859964 次浏览

使用DATENAMEDATEPART:

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

尽管SQLMenace的回答已被接受,但有一个重要的SET选项你应该知道

SET DATEFIRST

DATENAME将返回正确的日期的名字,但不返回相同的DATEPART值,如果一周的第一天已更改,如下所示。

declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select  [@DefaultDateFirst] = @DefaultDateFirst
    

set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7


--; Set the first day of week to * TUESDAY *
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst

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

查看以下网站以获得更好的解决方案: MS SQL:星期的一天 < / p >

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

SELECT  CASE DATEPART(WEEKDAY,GETDATE())
WHEN 1 THEN 'SUNDAY'
WHEN 2 THEN 'MONDAY'
WHEN 3 THEN 'TUESDAY'
WHEN 4 THEN 'WEDNESDAY'
WHEN 5 THEN 'THURSDAY'
WHEN 6 THEN 'FRIDAY'
WHEN 7 THEN 'SATURDAY'
END

这是一个工作副本的我的代码检查它,如何从日期检索日期名称在SQL

CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData]
@FromDate date,
@ToDate date


As
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from
ProjectTimeSheet pts
join Projects p on pts.ProjectID=p.ID
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END

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

-- 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

欧洲:

declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);

在SQL Server 2012及以后的版本中,你可以使用FORMAT函数

SELECT FORMAT(GETDATE(), 'dddd')

如果你不想依赖@@DATEFIRST或使用DATEPART(weekday, DateColumn),只需自己计算星期几。

对于以周一为基准的周(欧洲),最简单的方法是:

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay

对于星期日为基础的周(美国)使用:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay

这返回了自1753年1月1日以来的工作日数字(1到7)。

你可以使用DATEPART(dw, GETDATE()),但要注意,结果将依赖于SQL server设置@@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
< p >使用例子: GetDayInWeek('2019-02-04 00:00:00', 1) < / p >

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

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

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

SELECT DATENAME(WEEKDAY,GETDATE()) AS WeekDay

SELECT DATENAME(W,GETDATE()) AS WeekDay