簡體   English   中英

在 SQL Server 2005/2008 中獲取星期幾

[英]Get day of week in SQL Server 2005/2008

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

SQL Server 2005/2008 中是否有內置函數? 還是我需要使用輔助表?

使用DATENAMEDATEPART

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

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

歐洲:

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

要獲得給定日期的星期幾的確定性值,您可以使用DATEPART ()@@datefirst的組合。 否則取決於服務器上的設置。

查看以下站點以獲得更好的解決方案: MS SQL:星期

星期幾將在 0 到 6 的范圍內,其中 0 是星期日,1 是星期一等。然后您可以使用簡單的 case 語句返回正確的工作日名稱。

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

SELECT FORMAT(GETDATE(), 'dddd')

這是我的代碼的工作副本 檢查它,如何從 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

如果您不想依賴@@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 日和 7 日以來的工作日數(1 到 7)。

您可以使用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 服務器 DATEFIRST 設置):

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

除了以上所有答案,dw 代表工作日

SELECT DATENAME(WEEKDAY,GETDATE()) AS WeekDay

或者

SELECT DATENAME(W,GETDATE()) AS WeekDay

您可能會發現此版本很有用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM