Wenn ich ein Datum 01.01.2009 habe, möchte ich herausfinden, an welchem Tag es z. Montag, Dienstag usw.
Gibt es in SQL 2005/2008 eine integrierte Funktion dafür? Oder muss ich einen Hilfstisch verwenden?
Obwohl die Antwort von SQLMenace akzeptiert wurde, gibt es eine wichtige Option, SET
, die Sie kennen sollten
DATENAME gibt das korrekte Datum name zurück, aber nicht denselben DATEPART Wert, wenn der erste Wochentag wie unten gezeigt 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
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
Um einen deterministischen Wert für den Wochentag für ein bestimmtes Datum zu erhalten, können Sie eine Kombination aus DATEPART () und @@ datefirst verwenden. Ansonsten sind Sie abhängig von den Einstellungen auf dem Server.
Auf der folgenden Website finden Sie eine bessere Lösung: MS SQL: Day of Week
Der Wochentag liegt dann im Bereich von 0 bis 6, wobei 0 für Sonntag, 1 für Montag usw. steht. Dann können Sie eine einfache Case-Anweisung verwenden, um den richtigen Wochentagnamen zurückzugeben.
EUROPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Ab SQL Server 2012 können Sie die Funktion FORMAT
verwenden
SELECT FORMAT(GETDATE(), 'dddd')
dies ist eine Arbeitskopie meines Codes. Überprüfen Sie, wie der Tagname vom Datum in SQL abgerufen wird
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
Viel Spaß beim Kodieren ....
Wenn Sie sich nicht auf @@DATEFIRST
verlassen oder DATEPART(weekday, DateColumn)
verwenden möchten, berechnen Sie einfach selbst den Wochentag.
Für Montag basierte Wochen (Europa) ist am einfachsten:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Für Sonntagswochen (Amerika) verwenden Sie:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Dies gibt die Wochentagsnummer (1 bis 7) seit dem 1. Januar bzw. 7. Januar 1753 zurück.
Sie können DATEPART(dw, GETDATE())
verwenden. Beachten Sie jedoch, dass das Ergebnis von der Einstellung @@DATEFIRST
des SQL-Servers abhängt, bei der es sich um den ersten Wochentag handelt (In Europa ist der Standardwert 7 der Sonntag).
Wenn Sie den ersten Tag der Woche in einen anderen Wert ändern möchten, können Sie SET DATEFIRST
verwenden. Dies kann jedoch Auswirkungen auf die gesamte Abfragesitzung haben, die Sie nicht möchten.
Alternativ können Sie den ersten Wochentagswert explizit als Parameter angeben und je nach @@DATEFIRST
-Einstellung vermeiden. Sie können die folgende Formel verwenden, um dies bei Bedarf zu erreichen:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
dabei ist @WeekStartDay
der erste Tag der Woche, den Sie für Ihr System wünschen (von 1 bis 7, dh von Montag bis Sonntag).
Ich habe es in die Funktion unten eingepackt, damit wir es problemlos wiederverwenden können:
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
Verwendungsbeispiel: GetDayInWeek('2019-02-04 00:00:00', 1)
Dies ist äquivalent zum folgenden (aber unabhängig von der Einstellung des SQL-Servers DATEFIRST):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Diese Version kann nützlich sein.
-- 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