在SQL 2005/2008中获取星期几

时间:2009-07-10 17:49:14

标签: sql sql-server datetime

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

SQL 2005/2008中是否有内置函数?或者我需要使用辅助表吗?

10 个答案:

答案 0 :(得分:641)

使用DATENAMEDATEPART

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

答案 1 :(得分:91)

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

答案 2 :(得分:24)

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

答案 3 :(得分:12)

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

查看以下网站以获得更好的解决方案: MS SQL: Day of Week

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

答案 4 :(得分:11)

欧洲:

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

答案 5 :(得分:6)

使用SQL Server 2012及更高版本,您可以使用FORMAT函数

SELECT FORMAT(GETDATE(), 'dddd')

答案 6 :(得分:3)

这是我的代码的工作副本检查它,如何从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

快乐的编码......

答案 7 :(得分:1)

如果您不想依赖@@DATEFIRST或使用DATEPART(weekday, DateColumn),请自行计算一周中的某一天。

对于周一的周(欧洲),最简单的是:

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

对于周日周(美国)使用:

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

自1月1日起分别于1753年7月7日返回工作日编号(1至7)。

答案 8 :(得分:0)

您可能会发现此版本很有用。

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

答案 9 :(得分:0)

您可以使用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

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

它等效于以下内容(但独立于SQL Server DATEFIRST设置):

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