Se ho una data 01/01/2009, voglio scoprire che giorno è stato ad esempio lunedì, martedì, ecc ...
Esiste una funzione integrata per questo in SQL Server 2005/2008? O devo usare una tabella ausiliaria?
Se ho una data 01/01/2009, voglio scoprire che giorno è stato ad esempio lunedì, martedì, ecc ...
Esiste una funzione integrata per questo in SQL Server 2005/2008? O devo usare una tabella ausiliaria?
Risposte:
Anche se la risposta di SQLMenace è stata accettata, c'è SETun'opzione importante che dovresti conoscere
DATENAME restituirà il nome della data corretto ma non lo stesso valore DATEPART se il primo giorno della settimana è stato modificato come illustrato di seguito.
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. Domenica sarà sempre zero.
DayOfWeekenumerazione ha DayOfWeek.Sundayun valore ... 0. Pertanto, indipendentemente da ciò che DateFirstviene impostato, un valore restituito da SQL non trattatoWEEKDAY non sarà mai compatibile con la controparte .NET. Sì, 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())
Per ottenere un valore deterministico per il giorno della settimana per una determinata data, è possibile utilizzare una combinazione di DATEPART () e @@ datefirst . Altrimenti dipende dalle impostazioni sul server.
Controlla il seguente sito per una soluzione migliore: MS SQL: giorno della settimana
Il giorno della settimana sarà quindi compreso nell'intervallo da 0 a 6, dove 0 è domenica, 1 è lunedì, ecc. Quindi è possibile utilizzare un'istruzione case semplice per restituire il nome del giorno della settimana corretto.
EUROPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Con SQL Server 2012 e versioni successive è possibile utilizzare la FORMATfunzione
SELECT FORMAT(GETDATE(), 'dddd')
questa è una copia funzionante del mio codice verificalo, come recuperare il nome del giorno dalla data in 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
Se non vuoi dipendere @@DATEFIRSTo usare DATEPART(weekday, DateColumn), calcola tu stesso il giorno della settimana.
Per le settimane in base al lunedì (Europa) il più semplice è:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Per le settimane di domenica (America) utilizzare:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Questo restituisce il numero del giorno della settimana (da 1 a 7) dal 1 ° gennaio, rispettivamente, 7th, 1753.
È possibile utilizzare DATEPART(dw, GETDATE())ma tenere presente che il risultato si baserà sul @@DATEFIRSTvalore di impostazione del server SQL che è l' impostazione del primo giorno della settimana (in Europa valore predefinito 7 che è domenica).
Se si desidera modificare il primo giorno della settimana su un altro valore, è possibile utilizzare, SET DATEFIRSTma ciò può influire ovunque nella sessione di query che non si desidera.
Un modo alternativo è specificare esplicitamente il valore del primo giorno della settimana come parametro ed evitare a seconda @@DATEFIRSTdell'impostazione. È possibile utilizzare la seguente formula per ottenerlo quando necessario:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
dove si @WeekStartDaytrova il primo giorno della settimana desiderato per il sistema (da 1 a 7, ovvero da lunedì a domenica).
L'ho avvolto nella seguente funzione in modo da poterlo riutilizzare facilmente:
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
Esempio di utilizzo:
GetDayInWeek('2019-02-04 00:00:00', 1)
È equivalente al seguente (ma indipendente dall'impostazione DATEFIRST del server SQL):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Questa versione può essere utile.
-- 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