Obtenir le mois et l'année à partir d'une date / heure dans SQL Server 2005

87

J'ai besoin du mois + année à partir de la date et heure dans SQL Server comme «janvier 2008». Je regroupe la requête par mois, année. J'ai recherché et trouvé des fonctions comme datepart, convertir, etc., mais aucune d'entre elles ne semble utile pour cela. Est-ce que j'ai râté quelque chose? Y a-t-il une fonction pour cela?

Malik Daud Ahmad Khokhar
la source
@Evan Carroll - est-ce que cela revient à détourner la question? Si vous avez une réponse supérieure à la question, ne devrait-elle pas être fournie comme réponse à la question au lieu de diriger les gens vers une autre question?
STLDev
@STLDeveloper comment est-il détourné. La question appelle 2005? Je ne l'ai pas mis là. Je ne cherche pas 2005 .. Malheureusement, la meilleure réponse ici ne fonctionne pas sur 2005, c'est 2012-explicite. Dois-je décliner les réponses de 2005 pour être archaïque?
Evan Carroll
@STLDeveloper en fait, je m'en fiche ici. =) ma position officielle a toujours été de conseiller aux gens d'utiliser PostgreSQL, je ne sais pas pourquoi j'essaie d'aider.
Evan Carroll
Il m'a semblé étrange que vous soyez retourné créer une nouvelle version de la question pour une version différente du produit, puis pour répondre à cette question, ce qui, je suppose, est très bien.
STLDev

Réponses:

74

Si vous voulez dire que vous voulez les renvoyer sous forme de chaîne, dans ce format;

SELECT 
  CONVERT(CHAR(4), date_of_birth, 100) + CONVERT(CHAR(4), date_of_birth, 120) 
FROM customers

Voici les autres options de format

Robsoft
la source
J'ai essayé d'utiliser CONVERT (CHAR (4), GetDate (), 100) sur mon serveur SQL et j'ai obtenu "09 1" à la place. J'ai eu l'espace et un "1" pour le 17. en utilisant "select CONVERT (varchar, GetDate (), 100)" yield "09 17 2009 4:59 PM"
Nap
1
C'est bizarre - d'après les documents auxquels j'ai lié, 100 devrait renvoyer une abréviation de mois à trois lettres et un espace, s'il est jeté dans un CHAR (4). Mais alors, le résultat que vous avez publié pour un CONVERT (varchar, getdate (), 100) est différent de ce que je m'attendrais à voir. Quelle version de SQLServer utilisez-vous? Quels paramètres de localisation / internationalisation utilisez-vous (non pas que cela ait une importance pour un format 100).
robsoft
171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
HS.
la source
Donc, je pense que c'est ce que je veux, mais je ne vois pas comment TSQL comprendrait la différence entre datepart(month,getdate())et datepart(year,getdate()). Que sont le mois et l' année ?
jp2code
4
@ jp2code mois et année sont essentiellement des constantes définies ici: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL les comprend de la même manière que vous, en les lisant :)
Zachary Yates
1
LOL - Merci Zach. J'y ai joué longtemps avant de le découvrir sur un autre site.
jp2code
Beaucoup plus propre que la fonction de conversion. #cleanCode
RBT
51

À partir de SQL Server 2012, vous pouvez utiliser:

SELECT FORMAT(@date, 'yyyyMM')
CrimsonKing
la source
1
Bien joué monsieur ... cela a répondu à ma question en 2012
Squ1rr3lz
Je suis content d'avoir fait défiler jusqu'ici, c'est net et simple. Merci!
Niklas
C'est une contribution précieuse mais elle aurait dû trouver une réponse ailleurs, stackoverflow.com/a/43196370/124486
Evan Carroll
12

Utilisation:

select datepart(mm,getdate())  --to get month value
select datename(mm,getdate())  --to get name of month
Don
la source
11

Drôle, je jouais juste en écrivant cette même requête dans SQL Server puis LINQ.

SELECT 
    DATENAME(mm, article.Created) AS Month, 
    DATENAME(yyyy, article.Created) AS Year, 
    COUNT(*) AS Total 
FROM Articles AS article 
GROUP BY 
    DATENAME(mm, article.Created), 
    DATENAME(yyyy, article.Created) 
ORDER BY Month, Year DESC

Il produit la sortie suivante (exemple).

Month | Year | Total

January | 2009 | 2
Mike Geise
la source
9

Dans SQL Server 2012, ci-dessous peut être utilisé

sélectionnez FORMAT (getdate (), 'MMM yyyy')

Cela donne exactement "juin 2016"

constructeur de sites Web
la source
6

Que dis-tu de ça?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )
GordyII
la source
5
( Month(Created) + ',' + Year(Created) ) AS Date
Sampson
la source
5

Ce format n'existe pas. Vous devez faire une combinaison de deux choses,

select convert(varchar(4),getdate(),100)  + convert(varchar(4),year(getdate()))
SQLMenace
la source
4

la meilleure façon d'y parvenir est avec:

dateadd(month,datediff(month,0,*your_date*),0)

il conservera votre type de date / heure

cyber cyber1621
la source
1
C'est de loin la meilleure réponse pour forcer une date à n'être que le mois et l'année, en ignorant les composants du jour et de l'heure. Bien mieux que la réponse acceptée car les informations peuvent être triées correctement et fonctionnent correctement comme une date dans les outils de reporting en aval.
Jamie Thomas
Je suis tout à fait d’accord que c’est de loin la meilleure façon d’arriver au début du mois. Il conserve le type de données datetime et laisse le rendu au front-end, où il devrait être. C'est la bonne façon de faire des choses comme grouper les lignes par mois d'un champ.
Jeff Breadner
2

renvoie le nom complet du mois, -, année complète par exemple March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))
RobertC
la source
2
Il y a déjà 18 autres réponses à cette question. Quelles nouvelles informations votre réponse ajoute-t-elle?
stannius
1

J'ai eu le même problème et après avoir regardé autour de moi, j'ai trouvé ceci:

SELECT DATENAME(yyyy, date) AS year
FROM Income
GROUP BY DATENAME(yyyy, date)

Cela fonctionne très bien!

Peter Mortensen
la source
1

La conversion de la date en premier du mois vous permet de regrouper et de classer par un seul attribut, et c'est plus rapide selon mon expérience.

declare @mytable table(mydate datetime)
declare @date datetime
set @date = '19000101'
while @date < getdate() begin
    insert into @mytable values(@date)
    set @date = dateadd(day,1,@date)
end

select count(*) total_records from @mytable

select dateadd(month,datediff(month,0,mydate),0) first_of_the_month, count(*) cnt
from @mytable
group by dateadd(month,datediff(month,0,mydate),0)
Ron Smith
la source
1
---Lalmuni Demos---
create table Users
(
userid int,date_of_birth date
)
---insert values---
insert into Users values(4,'9/10/1991')

select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
from users
Lalmuni Singh
la source
1
cast(cast(sq.QuotaDate as date) as varchar(7))

donne le format "2006-04"

Gareth Thomas
la source
1

La question concerne SQL Server 2005, la plupart des réponses ici concernent la version ultérieure de SQL Server.

select convert (varchar(7), getdate(),20)
--Typical output 2015-04

SQL Server 2005 n'a pas de fonction de date qui a été introduite dans SQL Server 2008

Hammad Khan
la source
0

Oui, vous pouvez utiliser datename(month,intime)pour obtenir le mois sous forme de texte.

Alok Kumar
la source
0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

Réponse: MONTH_ Janvier Janvier Septembre Octobre Décembre Octobre Septembre

khmer angkor
la source
0

Cela fonctionne très bien.

DECLARE @pYear VARCHAR(4)

DECLARE @pMonth VARCHAR(2)

DECLARE @pDay VARCHAR(2)

SET @pYear  = RIGHT(CONVERT(CHAR(10), GETDATE(), 101), 4)

SET @pMonth = LEFT(CONVERT(CHAR(10), GETDATE(), 101), 2)

SET @pDay   = SUBSTRING(CONVERT(CHAR(10), GETDATE(), 101), 4,2)

SELECT @pYear,@pMonth,@pDay
GanbatSu
la source
-3

Ce qui suit fonctionne parfaitement! Je viens de l'utiliser, essayez-le.

date_format(date,'%Y-%c')
Matteo
la source
2
ce n'est pas une fonction ou une instruction de serveur SQL valide
franko_camron