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


369

如果我有一个日期01/01/2009,我想找出星期几,例如星期一,星期二等。

SQL Server 2005/2008中是否对此具有内置功能?还是我需要使用辅助表?


1
如果您有一个包含日期部分查找的表,则通常做错了什么。SQL Server的日期函数非常强大,因此您可以从datetime列上轻松完成需要从日期中提取的任何数据。
本杰明·奥丁09年

6
辅助表对于日期计算非常有用,拥有日历辅助表并不罕见...

2
“对日期计算有用”是高度可疑的。大多数日期计算都可以在没有任何辅助表的情况下进行处理,并且性能也会更好。在某些情况下,普通的Numbers表可以完成这项工作-不需要其中包含实际日期的表。我看到真正需要的日历表的唯一原因是,哪些日子是工作日,哪些日子不是很复杂的规则。我经常看到的是人们使用日期表,因为他们不知道如何做。然后,他们不得不经常填充日期表。愚蠢。
ErikE,2009年

5
如果您可以向我展示日历表的用法,我会吃惊的:1)不适用于复杂的假期/工作日规则,2)内置函数无法轻松完成,3)仅在以下情况下才能使用: 2,那么Numbers表也可以正常工作,不需要在表中填充特定日期。
ErikE,2009年

2
数据仓库大量使用日历表。预先计算的月份,季度,年份等为最终用户提供了可以过滤/汇总的字段。
David Rushton 2015年

Answers:


694

使用DATENAMEDATEPART

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

thx,我尝试过使用datename但使用d,给了我一个整数。dw按预期方式工作

39
这就是为什么我更喜欢使用select datename(weekday,getdate())的原因。我不必记住dw会返回工作日。...当我可以使用“工作日”时。
乔治·马斯特罗斯

9
任何浏览此内容的人-请注意,默认的一周开始时间为星期日。看看
@Sung

2
@niico这是因为从1 SQL指标而C像从0语言索引
user824276

95

即使SQLMenace的答案已被接受,SET您也应该注意一个重要的选择

设置日期

如果一周的第一天已更改,则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

33
因此,要获取恒定的datepart值,您可以这样做( @@datefirst - 1 + datepart(weekday, thedate) ) % 7。星期日将始终为零。
Endy Tjahjono 2012年

1
有点可怕,这些东西是静态的,所以您必须遵循原始查询,更改值,运行查询,重置原始模式
JonnyRaa 2014年

2
这个有趣的是,.NET的DayOfWeek枚举有DayOfWeek.Sunday一个值为... 0。因此,无论DateFirst设置为什么,未经处理的 SQL返回WEEKDAY值都不会与.NET兼容。是的,微软。
埃里克·吴

26
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

26
您应该知道ther是实现相同功能的内置函数。select datename(dw,getdate())
Soham Dasgupta'4

10
对于非英语版本的MS SQL,此内置函数@SohamDasgupta不会返回相同的结果。
Scapegrace先生,

12

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

请访问以下站点以获得更好的解决方案:MS SQL:星期

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


5
请将答案放入答案中,这样人们就不必单击链接即可获得答案。
马丁·史密斯,

11

欧洲:

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

2
请说明您的代码的功能以及它如何回答问题。如果您得到一个代码片段作为答案,那么您可能不知道该怎么做。答案应为OP和未来的访问者提供有关如何调试和解决其问题的指南。指出,代码背后的思想是什么,将大大有助于理解问题并应用或修改解决方案。
Palec 2014年


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

1

如果您不想依赖@@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)。


1

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

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 

1
这是令人费解的代码,并没有说明它在做什么或试图达到什么目的
brewmanz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.