Abrufen von Monat und Jahr von einer Datums- / Uhrzeitangabe in SQL Server 2005

85

Ich benötige den Monat + Jahr ab dem Datum / Uhrzeit in SQL Server wie 'Jan 2008'. Ich gruppiere die Abfrage nach Monat, Jahr. Ich habe Funktionen wie Datumsteil, Konvertierung usw. gesucht und gefunden, aber keine davon scheint dafür nützlich zu sein. Vermisse ich hier etwas? Gibt es dafür eine Funktion?

Malik Daud Ahmad Khokhar
quelle
@Evan Carroll - stellt dies eine Entführung der Frage dar? Wenn Sie eine überlegene Antwort auf die Frage haben, sollte diese nicht als Antwort auf die Frage angegeben werden, anstatt die Leute auf eine andere Frage hinzuweisen?
STLDev
@ STLDeveloper wie ist es Hijacking. Die Frage fordert für 2005? Das habe ich dort nicht hingelegt. Ich suche nicht nach 2005. Leider funktioniert die beste Antwort hier nicht auf 2005, sie ist 2012 explizit. Sollte ich die Antworten von 2005 als archaisch ablehnen?
Evan Carroll
@ STLDeveloper eigentlich ist mir das hier egal. =) Meine offizielle Haltung war immer, Leuten zu raten, PostgreSQL zu verwenden, nicht sicher, warum ich versuche zu helfen.
Evan Carroll
Es kam mir nur seltsam vor, dass Sie zurückgegangen sind, um eine neue Version der Frage für eine andere Version des Produkts zu erstellen und dann diese Frage zu beantworten, was meiner Meinung nach in Ordnung ist.
STLDev

Antworten:

73

Wenn Sie meinen, dass Sie sie als Zeichenfolge in diesem Format zurückhaben möchten;

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

Hier sind die anderen Formatoptionen

Robsoft
quelle
Ich habe versucht, CONVERT (CHAR (4), GetDate (), 100) auf meinem SQL Server zu verwenden, und stattdessen "09 1" erhalten. Ich habe das Leerzeichen und eine "1" für die 17. mit "select CONVERT (varchar, GetDate (), 100)" ergeben "09 17 2009 4:59 PM"
Nap
1
Das ist seltsam - aus den Dokumenten, mit denen ich verlinkt habe, sollten 100 eine dreistellige Monatsabkürzung und ein Leerzeichen zurückgeben, wenn sie in ein CHAR (4) eingefügt werden. Aber dann sieht das Ergebnis, das Sie für ein CONVERT (varchar, getdate (), 100) gepostet haben, anders aus als erwartet. Welche Version von SQLServer verwenden Sie? Welche Lokalisierungs- / Internationalisierungseinstellungen verwenden Sie (nicht, dass dies für ein 100-Format von Bedeutung sein sollte).
Robsoft
171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
HS.
quelle
Ich denke, das ist es, was ich will, aber ich sehe nicht, wie TSQL den Unterschied zwischen datepart(month,getdate())und verstehen würde datepart(year,getdate()). Was sind Monat und Jahr ?
jp2code
4
@ jp2code Monat und Jahr sind im Grunde genommen hier definierte Konstanten: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL versteht sie genauso wie Sie, indem Sie sie lesen :)
Zachary Yates
1
LOL - Danke Zach. Ich habe das lange gespielt, bevor ich es auf einer anderen Seite herausgefunden habe.
jp2code
Viel sauberer als die Konvertierungsfunktion. #cleanCode
RBT
49

Ab SQL Server 2012 können Sie Folgendes verwenden:

SELECT FORMAT(@date, 'yyyyMM')
CrimsonKing
quelle
1
Gut gespielt, Sir ... dies beantwortete meine Frage im Jahr 2012
Squ1rr3lz
Ich bin froh, dass ich so weit gescrollt habe, das ist ordentlich und einfach. Vielen Dank!
Niklas
Dies ist ein wertvoller Beitrag, aber er hätte an anderer Stelle beantwortet werden müssen: stackoverflow.com/a/43196370/124486
Evan Carroll
12

Verwenden:

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

Komisch, ich habe nur herumgespielt und dieselbe Abfrage in SQL Server und dann in LINQ geschrieben.

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

Es wird die folgende Ausgabe erzeugt (Beispiel).

Month | Year | Total

January | 2009 | 2
Mike Geise
quelle
9

In SQL Server 2012 kann unten verwendet werden

Wählen Sie FORMAT (getdate (), 'MMM yyyy')

Dies ergibt genau "Jun 2016"

Webbuilder
quelle
6

Wie wäre es damit?

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

Dieses Format existiert nicht. Sie müssen eine Kombination aus zwei Dingen tun:

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

Der beste Weg, dies zu tun, ist mit:

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

Ihr Datums- / Uhrzeittyp bleibt erhalten

cyber cyber1621
quelle
1
Dies ist bei weitem die beste Antwort, um zu erzwingen, dass ein Datum nur der Monat und das Jahr ist, wobei Tag- und Zeitkomponenten ignoriert werden. Viel besser als die akzeptierte Antwort, da die Informationen korrekt sortiert werden können und in nachgeschalteten Berichterstellungstools korrekt als Datum fungieren.
Jamie Thomas
Ich stimme voll und ganz zu, dass dies bei weitem der beste Weg ist, um den Anfang des Monats zu erreichen. Es behält den Datentyp datetime bei und belässt das Rendering bis zum Frontend, wo es sein sollte. Dies ist der richtige Weg, um beispielsweise Gruppenzeilen nach Monat eines Feldes auszuführen.
Jeff Breadner
2

gibt den vollständigen Monatsnamen zurück, -, das gesamte Jahr, z March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))
RobertC
quelle
2
Es gibt bereits 18 weitere Antworten auf diese Frage. Welche neuen Informationen fügt Ihre Antwort hinzu?
Stannius
1

Ich hatte das gleiche Problem und nachdem ich mich umgesehen hatte, fand ich Folgendes:

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

Es funktioniert großartig!

Peter Mortensen
quelle
1

Wenn Sie das Datum in den ersten des Monats konvertieren, können Sie nach einem einzelnen Attribut gruppieren und sortieren. Dies ist meiner Erfahrung nach schneller.

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
quelle
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
quelle
1
cast(cast(sq.QuotaDate as date) as varchar(7))

gibt das Format "2006-04" an

Gareth Thomas
quelle
1

Die Frage bezieht sich auf SQL Server 2005, viele der Antworten hier beziehen sich auf SQL Server der späteren Version.

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

SQL Server 2005 verfügt nicht über eine Datumsfunktion, die in SQL Server 2008 eingeführt wurde

Hammad Khan
quelle
0

Ja, Sie können datename(month,intime)den Monat in Textform abrufen.

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

Antwort: MONAT_ Januar Januar September Oktober Dezember Dezember Oktober September

Khmer Angkor
quelle
0

Es funktioniert großartig.

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
quelle
-3

Das Folgende funktioniert perfekt! Ich habe es gerade benutzt, probiere es aus.

date_format(date,'%Y-%c')
Matteo
quelle
2
Dies ist keine gültige SQL Server-Funktion oder Anweisung
franko_camron