web-dev-qa-db-fra.com

Obtenir le nom du jour de la semaine à partir d'une date donnée dans SQL Server

J'essaie d'obtenir un nom de jour comme vendredi, samedi, dimanche, lundi, etc. à partir d'une date donnée. Je sais qu'il existe une fonction intégrée qui renvoie le nom du jour, par exemple:

SELECT DATENAME(dw,'09/23/2013') as theDayName 

cette requête SQL renvoie:

'lundi'

Tout va bien. Mais je voudrais passer Month, Day and Year individuellement.

J'utilise la fonction DATEPART intégrée pour extraire le mois, le jour et l'année d'une date afin de pouvoir la transmettre à la fonction DATENAME:

SELECT DATEPART(m, GETDATE()) as theMonth  -- returns 11
SELECT DATEPART(d, GETDATE()) as theDay   -- returns 20
SELECT DATEPART(yy, GETDATE()) as theYear   -- returns 2013

Maintenant que j'ai les valeurs Mois, Jour, Année individuellement, je le passe à mon DATENAME pour obtenir le Weekname de la date que je veux:

--my SQL query to return dayName
SELECT (DATENAME(dw, DATEPART(m, GETDATE())/DATEPART(d, myDateCol1)/ DATEPART(yy, getdate())))  as myNameOfDay, FirstName, LastName FROM myTable

Cela renvoie un nom de jour incorrect. J'ai essayé de remplacer/avec - pour que dans la fonction DATENAME, ma requête SQL devienne:

SELECT DATENAME(dw,'09/23/2013') 
--becomes
SELECT DATENAME(dw,'09-23-2013') 

mais il renvoie toujours dayName incorrect de ma requête SQL. Est-ce que j'ai râté quelque chose.

S'il vous plaît donnez votre avis.

55
theITvideos

Vous devez construire une chaîne de date. Vous utilisez des opérateurs / ou - qui effectuent des opérations MATH/numériques sur les valeurs de retour numériques de DATEPART. Ensuite, DATENAME prend cette valeur numérique et l’interprète comme une date.

Vous devez le convertir en chaîne. Par exemple:

SELECT (
  DATENAME(dw, 
  CAST(DATEPART(m, GETDATE()) AS VARCHAR) 
  + '/' 
  + CAST(DATEPART(d, myDateCol1) AS VARCHAR) 
  + '/' 
  + CAST(DATEPART(yy, getdate()) AS VARCHAR))
  )
42
Eli Gassert

Testé et fonctionne sous SQL 2005 et 2008. Je ne sais pas si cela fonctionnera en 2012 et après.

La solution utilise DATENAME au lieu de DATEPART

select datename(dw,getdate()) --Thursday
select datepart(dw,getdate()) --2
69
Irfan Raza

Si vous avez SQL Server 2012:

Si vos parties de date sont des entiers, vous pouvez utiliser la fonction DATEFROMPARTS .

SELECT DATENAME( dw, DATEFROMPARTS( @Year, @Month, @Day ) )

Si vos parties de date sont des chaînes, vous pouvez utiliser la fonction CONCAT .

SELECT DATENAME( dw, CONVERT( date, CONCAT( @Day, '/' , @Month, '/', @Year ), 103 ) )
6
Greenstone Walker

Essayez comme ceci: sélectionnez DATENAME (DW, GETDATE ())

3
Author PraWin
SELECT DATENAME(DW,CONVERT(VARCHAR(20),GETDATE(),101))