Wenn ich ein Datum vom 01.01.2009 habe, möchte ich herausfinden, welcher Tag es war, z. B. Montag, Dienstag usw.
Gibt es hierfür eine integrierte Funktion in SQL Server 2005/2008? Oder muss ich einen Hilfstisch verwenden?
Wenn ich ein Datum vom 01.01.2009 habe, möchte ich herausfinden, welcher Tag es war, z. B. Montag, Dienstag usw.
Gibt es hierfür eine integrierte Funktion in SQL Server 2005/2008? Oder muss ich einen Hilfstisch verwenden?
Antworten:
Verwenden Sie DATENAME
oder DATEPART
:
SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
Obwohl die Antwort von SQLMenace akzeptiert wurde, gibt es eine wichtige SET
Option, die Sie kennen sollten
DATENAME wird korrektes Datum zurückgeben Namen aber nicht den gleichen DATEPART Wert , wenn der erste Tag der Woche geändert wurde , wie unten dargestellt.
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
. Der Sonntag wird immer Null sein.
DayOfWeek
Aufzählung von .NET DayOfWeek.Sunday
einen Wert von .... hat 0
. Unabhängig davon, worauf festgelegt DateFirst
ist, ist ein unbehandelter SQL-zurückgegebener WEEKDAY
Wert niemals mit dem .NET-Gegenstück kompatibel. Ja, 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())
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: Wochentag
Der Wochentag liegt dann im Bereich von 0 bis 6, wobei 0 Sonntag, 1 Montag usw. ist. Anschließend können Sie mithilfe einer einfachen case-Anweisung den richtigen Wochentagsnamen zurückgeben.
EUROPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Ab SQL Server 2012 können Sie die FORMAT
Funktion verwenden
SELECT FORMAT(GETDATE(), 'dddd')
Dies ist eine Arbeitskopie meines Codes. Überprüfen Sie, wie Sie den Tagesnamen vom Datum in SQL abrufen können
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
Wenn Sie nicht abhängig sein @@DATEFIRST
oder verwenden möchten DATEPART(weekday, DateColumn)
, berechnen Sie einfach den Wochentag selbst.
Für montagsbasierte 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. dem 7. Januar 1753 zurück.
Sie können verwenden, DATEPART(dw, GETDATE())
aber beachten Sie, dass das Ergebnis vom SQL Server-Einstellungswert @@DATEFIRST
abhängt, der der erste Wochentag ist (in Europa ist der Standardwert 7 der Sonntag).
Wenn Sie den ersten Wochentag in einen anderen Wert ändern möchten, können Sie ihn verwenden. SET DATEFIRST
Dies kann sich jedoch auf alle Bereiche Ihrer Abfragesitzung auswirken, die Sie nicht möchten.
Alternativ können Sie den Wert für den ersten Wochentag 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
Wo @WeekStartDay
ist der erste Wochentag, den Sie für Ihr System wünschen (von 1 bis 7, dh von Montag bis Sonntag)?
Ich habe es in die folgende Funktion eingewickelt, damit wir es leicht 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
Anwendungsbeispiel:
GetDayInWeek('2019-02-04 00:00:00', 1)
Dies entspricht den folgenden Einstellungen (unabhängig von der Einstellung DATEFIRST des SQL-Servers):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
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)+@@datefirst-1)*4+1,3),Datum
from #test