Якщо у мене є дата 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
встановлено, необроблене SQL повернене WEEKDAY
значення ніколи не буде сумісним з аналогом .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 - понеділок і т.д.
ЄВРОПА:
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 січня відповідно 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