2009-07-10 2 views
288

Se ho una data 01/01/2009, voglio scoprire che giorno era, ad es. Lunedì, martedì, ecc ...Ottenere il giorno della settimana in SQL 2005/2008

Esiste una funzione integrata per questo in SQL 2005/2008? O devo usare una tabella ausiliaria?

+1

Se si dispone di una tabella contenente ricerche per le porzioni di data, in genere si è fatto qualcosa di sbagliato.Le funzioni di data di SQL Server sono molte e robuste, quindi è possibile eseguire prontamente i dati da estrarre da una data in una colonna datetime. Le tabelle ausiliarie –

+4

sono molto utili per i calcoli di date, non è insolito avere una tabella ausiliaria di calendario ... –

+2

"Utile per i calcoli di date" è molto dubbio. La maggior parte dei calcoli di date può essere gestita senza alcun tipo di tabella ausiliaria e funzionerà anche meglio. In alcuni casi, una semplice tabella Numbers farà il lavoro - non c'è bisogno di una tabella con date effettive al suo interno. L'unica ragione per cui ho visto che è necessaria una tabella di calendario effettiva è quando le regole per quali giorni sono giorni di lavoro e quali giorni non sono molto complicati. Quello che ho visto fin troppo spesso è che le persone usano le tabelle delle date perché non sanno come farlo in un altro modo. Quindi devono popolare la tabella della data ogni tanto. Silly. – ErikE

risposta

571

Usa DATENAME o DATEPART:

SELECT DATENAME(dw,GETDATE()) -- Friday 
SELECT DATEPART(dw,GETDATE()) -- 6 
+0

thx, avevo provato datename ma usato d, mi ha restituito un intero. dw funziona come previsto –

+25

Ecco perché preferisco usare select datename (weekday, getdate()). Non devo ricordare che dw ritorna il giorno della settimana ... quando posso usare "feriale" invece. –

+9

chiunque dia un'occhiata a questo - si noti che ** l'inizio predefinito della settimana è domenica **. Guarda la risposta di @ Sung su come cambiare in modo sicuro –

83

Anche se la risposta di SQLMenace è stata accettata, c'è un importante SET opzione che si dovrebbe essere a conoscenza di

SET DATEFIRST

DATENAME volontà restituire la data corretta nome 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 
+27

Quindi, per ottenere un valore di datapart costante, si esegue '(@@ datefirst - 1 + datapart (giorno della settimana, data di scadenza))% 7'. La domenica sarà sempre zero. –

+1

kindof orribile questa roba è statica in modo da avere a seguire l'originale di query, modificare il valore, interrogare correre, reset originale modello –

+0

sì, tu sei uomo giusto, questa è una nota importante (Y) –

10

per ottenere un valore deterministico per il giorno della settimana per una certa data è possibile utilizzare una combinazione di DATEPART() e @@datefirst. Altrimenti dipende dalle impostazioni sul server.

controllare il seguente sito per una soluzione migliore: MS SQL: Day of Week

Il giorno della settimana sarà quindi nel range 0-6, dove 0 è Domenica, 1 è Lunedi, ecc Poi è possibile utilizzare un semplice dichiarazione del caso per restituire il nome del giorno della settimana corretto.

+3

Inserisci la risposta nella risposta in modo che le persone non debbano fare clic su un collegamento per raggiungerlo. –

+0

Questo sarebbe accettato come risposta corretta. Grazie. – Juozas

20
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 
+22

Dovresti sapere che c'è una funzione integrata per ottenere lo stesso risultato. 'select datename (dw, getdate())' –

+1

Grazie, la funzione incorporata può ridurre la riga di codice – Sutirth

+5

@SohamDasgupta questa funzione incorporata non restituisce lo stesso risultato per la versione non inglese di MS SQL. –

3

Si tratta di una copia di lavoro del mio codice a controllare, come retrive nome del giorno a partire 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 

Felice di codifica ....

+0

Che ne dici di un tagging felice? ;) – tamasgal

+0

ah ah ah ...... –

0

Si può trovare questa versione 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)[email protected]@datefirst-1)*4+1,3),Datum 
     from #test 
+1

Questo è il codice ottusa, e non dà alcuna indicazione di quello che sta facendo o cercando di raggiungere – brewmanz

8

EUROPA:

declare @d datetime; 
set @d=getdate(); 
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1); 
+2

Si prega di includere spiegazione di ciò che il codice fa e come si risponde alla domanda. Se ottieni uno snippet di codice come risposta, potresti non sapere cosa farne. La risposta dovrebbe fornire all'OP e ai futuri visitatori indicazioni su come eseguire il debug e risolvere il problema. Sottolineando l'idea alla base del tuo codice, è di grande aiuto per comprendere il problema e applicare o modificare la tua soluzione. – Palec

5

Con SQL Server 2012 e poi è possibile utilizzare la funzione di

SELECT FORMAT(GETDATE(), 'dddd') 
1

FORMAT Se non si vuole dipendere da @@DATEFIRST o utilizzare DATEPART(weekday, DateColumn), basta calcola tu stesso il giorno della settimana.

Per settimane lunedì all'occupazione (Europa) più semplice è:

SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay 

Per settimane a base di Domenica (America) Uso:

SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay 

Questa restituire il numero giorno della settimana (da 1 a 7) sempre da gennaio 1 rispettivamente 7th, 1753.