Если у меня дата 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')