Получить день недели в SQL Server 2005/2008

Если у меня дата 01.01.2009, я хочу узнать, какой это был день, например, понедельник, вторник и т.д.

Есть ли встроенная функция для этого в SQL Server 2005/2008? Или мне нужно использовать вспомогательную таблицу?

Ответ 1

Используйте DATENAME или DATEPART:

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

Ответ 2

Несмотря на то, что ответ 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 not 7!
set datefirst @DefaultDateFirst

Ответ 3

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

Ответ 4

Чтобы получить детерминированное значение для дня недели для данной даты, вы можете использовать комбинацию DATEPART() и @@datefirst. В противном случае вы зависите от настроек на сервере.

Проверьте следующий сайт для лучшего решения: MS SQL: день недели

Тогда день недели будет в диапазоне от 0 до 6, где 0 - воскресенье, 1 - понедельник и т.д. Затем вы можете использовать простую инструкцию case, чтобы вернуть правильное название дня недели.

Ответ 5

ЕВРОПА:

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

Ответ 6

С SQL Server 2012 и далее вы можете использовать функцию FORMAT

SELECT FORMAT(GETDATE(), 'dddd')

Ответ 7

это рабочая копия моего кода, проверьте, как получить имя дня от даты в 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

Ответ 8

Если вы не хотите зависеть от @@DATEFIRST или используйте DATEPART(weekday, DateColumn), просто вычислите день недели самостоятельно.

Для недель в понедельник (Европа) проще всего:

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

В воскресные недели (Америка) используйте:

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

Это возвращает номер дня недели (от 1 до 7) с 1 января, соответственно 7, 1753.

Ответ 9

Вы можете найти эту версию полезной.

-- 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)[email protected]@datefirst-1)*4+1,3),Datum
        from #test 

Ответ 10

Вы можете использовать DATEPART(dw, GETDATE()) но помните, что результат будет зависеть от значения параметра @@DATEFIRST сервера SQL, который является значением первого дня недели (в Европе значение по умолчанию 7, которое является воскресеньем).

Если вы хотите изменить первый день недели на другое значение, вы можете использовать SET DATEFIRST но это может повлиять на 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)

Это эквивалентно следующему (но не зависит от параметра DATEFIRST сервера SQL):

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