Ottieni mese e anno da una data e ora in SQL Server 2005


87

Ho bisogno del mese + anno dal datetime in SQL Server come "Jan 2008". Raggruppo la query per mese, anno. Ho cercato e trovato funzioni come datepart, convert, ecc., Ma nessuna sembra utile per questo. Mi manca qualcosa qui? C'è una funzione per questo?


@Evan Carroll - questo significa dirottare la domanda? Se hai una risposta migliore alla domanda, non dovrebbe essere fornita come risposta alla domanda invece di indirizzare le persone a una domanda diversa?
STLDev

@STLDeveloper come sta dirottando. La domanda chiede per il 2005? Non l'ho messo lì. Non sto cercando il 2005 .. Sfortunatamente, la migliore risposta qui non funziona nel 2005, è esplicita nel 2012. Devo sottovalutare le risposte del 2005 per essere arcaiche?
Evan Carroll

@STLDeveloper in realtà, non mi interessa qui. =) la mia posizione ufficiale è sempre stata quella di consigliare alle persone di usare PostgreSQL, non sono sicuro del motivo per cui sto cercando di aiutare.
Evan Carroll

Mi è sembrato strano che tu tornassi indietro per creare una nuova versione della domanda per una versione diversa del prodotto e poi per rispondere a quella domanda, il che immagino vada bene.
STLDev

Risposte:


74

Se intendi che li rivuoi come stringa, in quel formato;

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

Ecco le altre opzioni di formato


Ho provato a utilizzare CONVERT (CHAR (4), GetDate (), 100) sul mio SQL Server e invece ho ottenuto "09 1". Ho ottenuto lo spazio e un "1" per il 17. utilizzando "select CONVERT (varchar, GetDate (), 100)" yield "09 17 2009 4:59 PM"
Nap

1
È strano: dai documenti a cui ho collegato, 100 dovrebbe restituire un'abbreviazione del mese di tre lettere e uno spazio, se inserito in un CHAR (4). Ma poi, il risultato che hai pubblicato per un CONVERT (varchar, getdate (), 100) sembra diverso da quello che mi sarei aspettato di vedere. Quale versione di SQLServer stai utilizzando? Quali impostazioni di localizzazione / internazionalizzazione stai utilizzando (non che questo dovrebbe avere importanza per un formato 100).
robsoft,

171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)

Quindi, penso che questo sia quello che voglio, ma non vedo come TSQL possa capire la differenza tra datepart(month,getdate())e datepart(year,getdate()). Cosa sono mese e anno ?
jp2code

4
@ jp2code mese e anno sono fondamentalmente costanti definite qui: msdn.microsoft.com/en-us/library/ms174420.aspx . TSQL li comprende allo stesso modo, leggendoli :)
Zachary Yates,

1
LOL - Grazie Zach. L'ho recitato a lungo prima di scoprirlo su un sito diverso.
jp2code

Molto più pulito della funzione di conversione. #cleanCode
RBT


12

Uso:

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

11

Divertente, stavo solo giocando a scrivere questa stessa query in SQL Server e poi in 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

Produce il seguente output (esempio).

Month | Year | Total

January | 2009 | 2

9

In SQL Server 2012, è possibile utilizzare di seguito

seleziona FORMAT (getdate (), 'MMM yyyy')

Questo dà esatto "giugno 2016"


6

Cosa ne pensi di questo?

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

5
( Month(Created) + ',' + Year(Created) ) AS Date

5

Quel formato non esiste. Devi fare una combinazione di due cose,

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

4

il modo migliore per farlo è con:

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

manterrà il tuo tipo datetime


1
Questa è di gran lunga la risposta migliore per forzare qualsiasi data a essere solo il mese e l'anno, ignorando i componenti del giorno e dell'ora. Molto meglio della risposta accettata perché le informazioni possono essere ordinate correttamente e funzionano correttamente come una data negli strumenti di reporting a valle.
Jamie Thomas

Sono assolutamente d'accordo sul fatto che questo sia di gran lunga il modo migliore per arrivare all'inizio del mese. Mantiene il tipo di dati datetime e lascia il rendering al front-end, dove dovrebbe essere. Questo è il modo corretto per eseguire operazioni come raggruppare le righe in base al mese di un campo.
Jeff Breadner

2

restituisce il nome completo del mese, -, l'intero anno es March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))

2
Ci sono già altre 18 risposte a questa domanda. Quali nuove informazioni aggiunge la tua risposta?
stannius

1

Ho avuto lo stesso problema e dopo essermi guardato intorno ho trovato questo:

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

Funziona alla grande!


1

La conversione della data al primo del mese ti consente di raggruppare per e ordinare per un singolo attributo, ed è più veloce nella mia esperienza.

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

fornisce il formato "2006-04"


1

La domanda riguarda SQL Server 2005, molte delle risposte qui sono per la versione successiva di SQL Server.

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

SQL Server 2005 non dispone della funzione data introdotta in SQL Server 2008


0

Sì, puoi utilizzare datename(month,intime)per ottenere il mese nel testo.


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

Risposta: MESE_ Gennaio Gennaio Settembre Ottobre Dicembre Ottobre Settembre


0

Funziona alla grande.

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

Quanto segue funziona perfettamente! L'ho appena usato, provalo.

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

2
questa non è una funzione o istruzione del server sql valida
franko_camron
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.