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?
Bien que la réponse de SQLMenace ait été acceptée, il existe une option SET
importante à connaître.
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
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
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.
L'EUROPE :
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
À partir de SQL Server 2012, vous pouvez utiliser la fonction FORMAT
.
SELECT FORMAT(GETDATE(), 'dddd')
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 ....
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.
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
où @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')
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