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'è SET
un'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.
DayOfWeek
enumerazione ha DayOfWeek.Sunday
un valore ... 0
. Pertanto, indipendentemente da ciò che DateFirst
viene 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 FORMAT
funzione
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 @@DATEFIRST
o 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 @@DATEFIRST
valore 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 DATEFIRST
ma 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 @@DATEFIRST
dell'impostazione. È possibile utilizzare la seguente formula per ottenerlo quando necessario:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
dove si @WeekStartDay
trova 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