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?


@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


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',...)

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')

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

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

9

In SQL Server 2012 kann unten verwendet werden

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

Dies ergibt genau "Jun 2016"


6

Wie wäre es damit?

Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )


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()))

4

Der beste Weg, dies zu tun, ist mit:

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

Ihr Datums- / Uhrzeittyp bleibt erhalten


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()))

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!


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)

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


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


0

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


0
  ,datename(month,(od.SHIP_DATE)) as MONTH_

Antwort: MONAT_ Januar Januar September Oktober Dezember Dezember Oktober September


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

-3

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

date_format(date,'%Y-%c')

2
Dies ist keine gültige SQL Server-Funktion oder Anweisung
franko_camron
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.