web-dev-qa-db-fra.com

Obtenir le jour de la semaine dans SQL 2005/2008

Si j'ai une date du 01/01/2009, je veux savoir quel jour c'était par exemple. Lundi, mardi, etc ...

Existe-t-il une fonction intégrée pour cela dans SQL 2005/2008? Ou dois-je utiliser une table auxiliaire?

319
aaaa

Utilisez DATENAME ou DATEPART :

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

Bien que la réponse de SQLMenace ait été acceptée, il existe une option SET importante à connaître.

SET DATEFIRST

DATENAME retournera la date correcte name mais pas la même DATEPART si le premier jour de la semaine a été modifié comme illustré ci-dessous.

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

Pour obtenir une valeur déterministe pour le jour de la semaine pour une date donnée, vous pouvez utiliser une combinaison de DATEPART () et @@ datefirst . Sinon, vous dépendez des paramètres sur le serveur.

Consultez le site suivant pour une meilleure solution: MS SQL: Jour de la semaine

Le jour de la semaine sera alors compris entre 0 et 6, 0 étant le dimanche, 1 le lundi, etc. Vous pouvez ensuite utiliser une simple instruction de cas pour renvoyer le nom du jour de la semaine correct.

12
lazerwire.com

L'EUROPE :

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

À partir de SQL Server 2012, vous pouvez utiliser la fonction FORMAT.

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

ceci est une copie de travail de mon code, vérifiez-le, comment récupérer le nom du jour à partir de la date en 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

Bonne codage ....

3
Tapan kumar

Si vous ne voulez pas dépendre de @@DATEFIRST ou utiliser DATEPART(weekday, DateColumn), calculez vous-même le jour de la semaine.

Pour les semaines basées le lundi (Europe), le plus simple est:

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

Pour les semaines basées le dimanche (Amérique), utilisez:

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

Ceci renvoie le numéro du jour de la semaine (1 à 7) depuis le 1er janvier ou le 7 janvier 1753.

1
Michel de Ruiter

Vous pouvez utiliser DATEPART(dw, GETDATE()) mais sachez que le résultat dépendra du paramètre SQL Server @@DATEFIRST qui correspond au premier jour de la semaine (la valeur par défaut 7 pour l'Europe est dimanche).

Si vous souhaitez remplacer le premier jour de la semaine par une autre valeur, vous pouvez utiliser SET DATEFIRST, mais cela peut affecter l’ensemble de votre session de requête, ce que vous ne souhaitez pas.

Une autre méthode consiste à spécifier explicitement la valeur du premier jour de la semaine en tant que paramètre et à éviter de dépendre du paramètre @@DATEFIRST. Vous pouvez utiliser la formule suivante pour y parvenir lorsque vous en avez besoin:

(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1

@WeekStartDay est le premier jour de la semaine que vous souhaitez pour votre système (de 1 à 7, du lundi au dimanche).

Je l'ai emballé dans la fonction ci-dessous afin que nous puissions le réutiliser facilement:

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

Exemple d'utilisation: GetDayInWeek('2019-02-04 00:00:00', 1)

Cela équivaut à ce qui suit (mais indépendant du paramètre DATEFIRST du serveur SQL): 

SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
0
Minh Nguyen

Vous pouvez trouver cette version 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)+@@datefirst-1)*4+1,3),Datum
        from #test 
0
Reto