Если у меня есть дата 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's not 7!
set datefirst @DefaultDateFirst
( @@datefirst - 1 + datepart(weekday, thedate) ) % 7
. Воскресенье всегда будет нулевым.
DayOfWeek
перечислении имеет DayOfWeek.Sunday
со значением ... 0
. Таким образом, независимо от того, что DateFirst
установлено, необработанное возвращаемое WEEKDAY
значение SQL никогда не будет совместимо с аналогом .NET. Ууу, Microsoft.
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
select datename(dw,getdate())
Чтобы получить детерминированное значение для дня недели для данной даты, вы можете использовать комбинацию 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.
Вы можете использовать, DATEPART(dw, GETDATE())
но имейте в виду, что результат будет зависеть от @@DATEFIRST
значения параметра сервера SQL, которое является значением первого дня недели (в Европе значение по умолчанию 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')
Вы можете найти эту версию полезной.
-- 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