Si j'ai une date 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 Server 2005/2008? Ou dois-je utiliser une table auxiliaire?
Si j'ai une date 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 Server 2005/2008? Ou dois-je utiliser une table auxiliaire?
Réponses:
SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
Même si la réponse de SQLMenace a été acceptée, il existe une SEToption importante que vous devez connaître
DATENAME renverra le nom de date correct mais pas la même valeur 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
( @@datefirst - 1 + datepart(weekday, thedate) ) % 7. Le dimanche sera toujours nul.
DayOfWeekl'énumération a DayOfWeek.Sundayune valeur de ... 0. Ainsi, quel que DateFirstsoit le paramètre défini, une valeur renvoyée par SQL non traitéeWEEKDAY ne sera jamais compatible avec l'homologue .NET. Oui, 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())
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 du 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, où 0 est le dimanche, 1 le lundi, etc. Vous pouvez ensuite utiliser une simple déclaration de casse pour renvoyer le nom de jour de semaine correct.
L'EUROPE :
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Avec SQL Server 2012 et versions ultérieures, vous pouvez utiliser la FORMATfonction
SELECT FORMAT(GETDATE(), 'dddd')
ceci est une copie de travail de mon code, vérifiez 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
Si vous ne voulez pas dépendre @@DATEFIRSTou utiliser DATEPART(weekday, DateColumn), calculez simplement le jour de la semaine vous-même.
Pour les semaines du lundi (Europe), la plus simple est:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Pour les semaines du dimanche (Amérique), utilisez:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Cela renvoie le numéro de semaine (1 à 7) depuis le 1er janvier respectivement le 7 1753.
Vous pouvez utiliser, DATEPART(dw, GETDATE())mais sachez que le résultat dépendra de la @@DATEFIRSTvaleur de paramètre du serveur SQL qui est le premier jour de la semaine (en Europe, la valeur par défaut 7, qui est le dimanche).
Si vous souhaitez remplacer le premier jour de la semaine par une autre valeur, vous pouvez l'utiliser, SET DATEFIRSTmais cela peut affecter partout dans 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 comme paramètre et à éviter de dépendre du @@DATEFIRSTréglage. Vous pouvez utiliser la formule suivante pour y parvenir en cas de besoin:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
où @WeekStartDayest le premier jour de la semaine que vous souhaitez pour votre système (de 1 à 7 ce qui signifie du lundi au dimanche).
Je l'ai enveloppé 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)
Il est équivalent à 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