Obtenha mês e ano a partir de uma data e hora no SQL Server 2005

87

Preciso do mês + ano a partir da data e hora no SQL Server, como 'janeiro de 2008'. Estou agrupando a consulta por mês, ano. Eu pesquisei e encontrei funções como datepart, convert, etc., mas nenhuma delas parece útil para isso. Estou faltando alguma coisa aqui? Existe uma função para isso?

Malik Daud Ahmad Khokhar
fonte
@Evan Carroll - isso constitui um sequestro da questão? Se você tem uma resposta superior para a pergunta, ela não deveria ser fornecida como uma resposta à pergunta, em vez de apontar as pessoas para uma pergunta diferente?
STLDev
@STLDeveloper como é o sequestro. A pergunta pede para 2005? Eu não coloquei isso aí. Não estou procurando 2005 .. Infelizmente, a melhor resposta aqui não funciona em 2005, é 2012-explícito. Devo rebaixar as respostas de 2005 por ser arcaico?
Evan Carroll
@STLDeveloper na verdade, não me importo aqui. =) minha posição oficial sempre foi aconselhar as pessoas a usarem o PostgreSQL, não sei por que estou tentando ajudar.
Evan Carroll,
Pareceu-me estranho que você tenha voltado para criar uma nova versão da pergunta para uma versão diferente do produto e, em seguida, respondido a essa pergunta, o que acho que está bom.
STLDev

Respostas:

74

Se você quer dizer que os quer de volta como uma string, nesse formato;

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

Aqui estão as outras opções de formato

roubo
fonte
Tentei usar CONVERT (CHAR (4), GetDate (), 100) no meu SQL Server e obtive "09 1" no lugar. Consegui o espaço e um "1" para 17. usando "select CONVERT (varchar, GetDate (), 100)" yield "09 17 2009 4:59 PM"
Nap
1
Isso é estranho - dos documentos que vinculei, 100 deve retornar uma abreviatura de três letras do mês e um espaço, se inserido em um CHAR (4). Mas então, o resultado que você postou para um CONVERT (varchar, getdate (), 100) parece diferente do que eu esperava ver. Qual versão do SQLServer você está usando? Quais configurações de localização / internacionalização você está usando (não que isso deva importar para um formato 100).
robsoft
171
select 
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
HS.
fonte
Então, acho que é isso que eu quero, mas não vejo como o TSQL entenderia a diferença entre datepart(month,getdate())e datepart(year,getdate()). O que são mês e ano ?
jp2code
4
@ jp2code mês e ano são basicamente constantes definidas aqui: msdn.microsoft.com/en-us/library/ms174420.aspx . O TSQL os entende da mesma maneira que você, lendo-os :)
Zachary Yates
1
LOL - Obrigado Zach. Eu estrelei isso muito tempo antes de descobrir em um site diferente.
jp2code
Muito mais limpo do que a função de conversão. #cleanCode
RBT
51

A partir do SQL Server 2012, você pode usar:

SELECT FORMAT(@date, 'yyyyMM')
Rei carmesim
fonte
1
Muito bem, senhor ... isso respondeu minha pergunta em 2012
Squ1rr3lz
Estou feliz por ter rolado até aqui, isso é limpo e simples. Obrigado!
Niklas de
Esta é uma contribuição valiosa, mas deveria ter sido respondida em outro lugar, stackoverflow.com/a/43196370/124486
Evan Carroll
12

Usar:

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

Engraçado, eu estava brincando de escrever essa mesma consulta no SQL Server e depois no 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

Ele produz a seguinte saída (exemplo).

Month | Year | Total

January | 2009 | 2
Mike Geise
fonte
9

No SQL server 2012, abaixo pode ser usado

selecione FORMAT (getdate (), 'MMM aaaa')

Isso dá exatamente "junho de 2016"

construtor de teias
fonte
6

Que tal agora?

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

Esse formato não existe. Você precisa fazer uma combinação de duas coisas,

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

a melhor maneira de fazer isso é com:

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

vai manter o seu tipo de data e hora

cyber cyber1621
fonte
1
Essa é de longe a melhor resposta para forçar qualquer data a ser apenas o mês e o ano, ignorando os componentes de dia e hora. Muito melhor do que a resposta aceita porque as informações podem ser classificadas corretamente e funcionam corretamente como uma data nas ferramentas de relatórios posteriores.
Jamie Thomas
Concordo sinceramente que esta é de longe a melhor maneira de começar o mês. Ele mantém o tipo de dados datetime e deixa a renderização para o front end, onde deveria estar. Esta é a maneira correta de fazer coisas como agrupar linhas por mês de um campo.
Jeff Breadner de
2

retorna o nome completo do mês, -, ano completo, por exemplo March-2017

CONCAT(DATENAME(mm, GetDate()), '-', DATEPART(yy, GetDate()))
RobertC
fonte
2
Já existem 18 outras respostas para esta pergunta. Que novas informações sua resposta adiciona?
stannius
1

Tive o mesmo problema e depois de dar uma olhada descobri o seguinte:

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

Está funcionando muito bem!

Peter Mortensen
fonte
1

Converter a data para o primeiro dia do mês permite agrupar por e ordenar por um único atributo, e é mais rápido na minha experiência.

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

dá o formato "2006-04"

Gareth Thomas
fonte
1

A pergunta é sobre o SQL Server 2005, muitas das respostas aqui são para versões posteriores do SQL Server.

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

SQL Server 2005 não tem função de data que foi introduzida no SQL Server 2008

Hammad Khan
fonte
0

Sim, você pode usar datename(month,intime)para obter o mês em texto.

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

Resposta: MONTH_ janeiro janeiro setembro outubro dezembro outubro setembro

khmer angkor
fonte
0

É um ótimo trabalho.

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

O seguinte funciona perfeitamente! Eu apenas usei, experimente.

date_format(date,'%Y-%c')
Matteo
fonte
2
esta não é uma função ou instrução do servidor sql válida
franko_camron