Если у меня дата 01.01.2009, я хочу узнать, какой это был день, например, понедельник, вторник и т.д.
Есть ли встроенная функция для этого в SQL Server 2005/2008? Или мне нужно использовать вспомогательную таблицу?
Если у меня дата 01.01.2009, я хочу узнать, какой это был день, например, понедельник, вторник и т.д.
Есть ли встроенная функция для этого в SQL Server 2005/2008? Или мне нужно использовать вспомогательную таблицу?
Используйте DATENAME или DATEPART:
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 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
Чтобы получить детерминированное значение для дня недели для данной даты, вы можете использовать комбинацию DATEPART() и @@datefirst. В противном случае вы зависите от настроек на сервере.
Проверьте следующий сайт для лучшего решения: MS SQL: день недели
Тогда день недели будет в диапазоне от 0 до 6, где 0 - воскресенье, 1 - понедельник и т.д. Затем вы можете использовать простую инструкцию case, чтобы вернуть правильное название дня недели.
ЕВРОПА:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
С 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
Это возвращает номер дня недели (от 1 до 7) с 1 января, соответственно 7, 1753.
Вы можете найти эту версию полезной.
-- 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 
 Вы можете использовать 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')