2009-07-10 1 views
288

Wenn ich ein Datum 01/01/2009 habe, möchte ich herausfinden, welcher Tag es war z. Montag, Dienstag, etc ...Erhalte den Wochentag in SQL 2005/2008

Gibt es dafür in SQL 2005/2008 eine eingebaute Funktion? Oder muss ich einen Hilfstisch verwenden?

+1

Wenn Sie eine Tabelle mit Nachschlagen für Datumsangaben haben, haben Sie im Allgemeinen etwas falsch gemacht.Die Datumsfunktionen von SQL Server sind zahlreich und robust, sodass alle Daten, die Sie aus einem Datum extrahieren müssen, in einer datetime-Spalte problemlos erledigt werden können. –

+4

Hilfstabellen sind sehr nützlich für Datumsberechnungen, es ist nicht ungewöhnlich, eine Kalenderhilfstabelle zu haben ... –

+2

"Nützlich für Datumsberechnungen" ist sehr zweifelhaft. Die meisten Datumsberechnungen können ohne jegliche Hilfstabelle ausgeführt werden und werden auch besser funktionieren. In einigen Fällen wird eine einfache Numbers-Tabelle die Aufgabe übernehmen - keine Notwendigkeit für eine Tabelle mit tatsächlichen Daten darin. Der einzige Grund, warum ich gesehen habe, dass eine aktuelle Kalender Tabelle benötigt wird, ist wenn die Regeln, für welche Tage Arbeitstage sind und welche Tage nicht, sehr kompliziert sind. Was ich zu oft gesehen habe, sind Leute, die Datumstabellen benutzen, weil sie nicht wissen, wie sie es anders machen sollen. Dann müssen sie die Tabelle regelmäßig ausfüllen. Dumm. – ErikE

Antwort

571

Verwenden DATENAME oder DATEPART:

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

thx, ich hatte versucht dateiname aber d verwendet, gab mir eine ganze Zahl zurück. dw funktioniert wie erwartet –

+25

Deshalb verwende ich lieber wählen Sie Datum (Wochentag, getdate()). Ich muss nicht daran denken, dass dw Wochentag zurückgibt .... wenn ich stattdessen "wochentag" verwenden kann. –

+9

Wer sich darüber umsieht - beachten Sie, dass der ** Standardanfang der Woche Sonntag ist **. Sehen Sie sich @ Sungs Antwort an, wie Sie das sicher ändern können. –

83

Obwohl SQLMenace Antwort ist, akzeptiert es ist eine wichtige SET Option

bewusst

SET DATEFIRST

DATENAME werden sollte, korrektes Datum zurückgeben Name aber nicht gleich DATEPART Wert, wenn der erste Wochentag wie unten dargestellt geändert wurde.

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

Um einen konstanten Datumsteilwert zu erhalten, müssen Sie '(@@ Datum zuerst - 1 + Datumsteil (Wochentag, Datum))% 7 'eingeben. Sonntag wird immer Null sein. –

+1

irgendwie schrecklich diese Sache ist statisch, so müssen Sie die Abfrage original folgen, Wert ändern, Abfrage ausführen, Originalmuster zurücksetzen –

+0

yep, du hast Recht Mann, das ist eine wichtige Anmerkung (Y) –

10

Um einen deterministischen Wert für den Tag der Woche für ein bestimmtes Datum erhalten Sie eine Kombination aus DATEPART() und @@datefirst nutzen könnten. Ansonsten sind Sie auf die Einstellungen auf dem Server angewiesen.

Überprüfen Sie die folgende Website für eine bessere Lösung aus: MS SQL: Day of Week

Der Tag der Woche wird dann im Bereich von 0 bis 6, wobei 0 Sonntag, 1 Montag, usw. Dann können Sie ein verwenden einfache case-Anweisung, um den korrekten Wochentagnamen zurückzugeben.

+3

Bitte geben Sie die Antwort in die Antwort ein, damit die Leute nicht auf einen Link klicken müssen, um dorthin zu gelangen. –

+0

Dies würde als richtige Antwort akzeptiert werden. Vielen Dank. – 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

Sie sollten wissen, dass es eine eingebaute Funktion ist, um dasselbe zu erreichen. 'Wählen Sie date_name (dw, getdate())' –

+1

Danke, eingebaute Funktion kann Codezeile reduzieren – Sutirth

+5

@SohamDasgupta diese eingebaute Funktion gibt nicht das gleiche Ergebnis für nicht-englische Version von MS SQL zurück. –

3

dies ist eine Arbeitskopie von meinem Code überprüfen Sie es, wie in SQL-Tag Name von Datum retrive

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 

Glücklich Codierung ....

+0

Wie wäre es mit Happy Tagging? ;) – tamasgal

+0

ha ha ha ...... –

0

Sie können diese Version nützlich finden .

-- 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

Dies ist stumpfer Code und gibt keinen Hinweis darauf, was es tut oder versucht zu erreichen – brewmanz

8

EUROPA:

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

Bitte erläutern Sie, was Ihr Code tut und wie es die Frage beantwortet. Wenn Sie ein Code-Snippet als Antwort erhalten, wissen Sie möglicherweise nicht, was Sie damit machen sollen. Antwort sollte dem OP und zukünftigen Besuchern Hinweise geben, wie sie ihr Problem beheben und beheben können. Die Idee hinter Ihrem Code ist sehr hilfreich, um das Problem zu verstehen und Ihre Lösung anzuwenden oder zu modifizieren. – Palec

5

Mit SQL Server 2012 und weiter können Sie die Verwendung FORMAT Funktion

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

Wenn Sie möchten, auf @@DATEFIRST nicht hängen oder DATEPART(weekday, DateColumn) zu bedienen, einfach Berechnen Sie den Wochentag selbst.

Für Montag basierend Wochen (Europe) einfachste ist:

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

Für Sonntag basierte Wochen (Amerika) verwenden:

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

Diese Rückkehr der Wochentag Nummer (1 bis 7), seit Januar 1. bzw. 7., 1753.