it-swarm.com.de

Erhalten Sie den Wochentag in SQL 2005/2008

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?

319
aaaa

Verwenden Sie DATENAME oder DATEPART :

SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
624
SQLMenace

Obwohl die Antwort von SQLMenace akzeptiert wurde, gibt es eine wichtige Option, SET, die Sie kennen sollten

SET DATEFIRST

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
88
Sung M. Kim
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
24
Sutirth

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.

12
lazerwire.com

EUROPA:

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

Ab SQL Server 2012 können Sie die Funktion FORMAT verwenden

SELECT FORMAT(GETDATE(), 'dddd')
6
Chris Stillwell

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

3
Tapan kumar

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.

1

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')
0
Minh Nguyen

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