Получить день недели в SQL 2005/2008 - PullRequest
338 голосов
/ 10 июля 2009

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

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

Ответы [ 10 ]

646 голосов
/ 10 июля 2009

Использование DATENAME или DATEPART:

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
91 голосов
/ 11 июля 2009

Несмотря на то, что ответ 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
24 голосов
/ 30 марта 2012
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
12 голосов
/ 07 октября 2011

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

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

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

11 голосов
/ 02 сентября 2014

ЕВРОПА:

declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
6 голосов
/ 18 октября 2016

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

SELECT FORMAT(GETDATE(), 'dddd')
3 голосов
/ 30 октября 2012

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

Если вы не хотите зависеть от @@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 г.

0 голосов
/ 07 февраля 2019

Вы можете использовать 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)

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

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
0 голосов
/ 05 сентября 2013

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

-- 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...