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 SET
option 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.
DayOfWeek
l'énumération a DayOfWeek.Sunday
une valeur de ... 0
. Ainsi, quel que DateFirst
soit 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 FORMAT
fonction
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 @@DATEFIRST
ou 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 @@DATEFIRST
valeur 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 DATEFIRST
mais 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 @@DATEFIRST
réglage. Vous pouvez utiliser la formule suivante pour y parvenir en cas de 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 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