Como obter uma data no formato AAAA-MM-DD a partir de um campo de data e hora TSQL?

259

Como recupero uma data do SQL Server no YYYY-MM-DDformato? Eu preciso disso para trabalhar com o SQL Server 2000 e superior. Existe uma maneira simples de fazer isso no SQL Server ou seria mais fácil convertê-lo programaticamente depois de recuperar o conjunto de resultados?

Eu li o CAST e o CONVERT no Microsoft Technet, mas o formato que eu quero não está listado e alterar o formato da data não é uma opção.

Kinze
fonte
A descrição da BOL para 126 é um pouco confusa (nunca encontrou uma explicação para "T").
Nojlagag
O "T" separa a data da hora. Veja a ISO 8601 na Wikipedia
krubo 5/12/16

Respostas:

428
SELECT CONVERT(char(10), GetDate(),126)

Limitando o tamanho das costeletas varchar da parte da hora que você não deseja.

Darrel Miller
fonte
3
Não, mas alguns clientes têm problemas com o comprimento fixo.
gbn 20/05/2009
54
Este post vem no Google por se converter ao AAAAMMDD - para que um é: Converter (char (10), GetDate (), 112)
NealWalters
1
Isso não funcionou para mim, a sugestão acima com um código 112 funcionou. Obrigado @NealWalters
AlexVPerl
4
A lista de códigos inteiros para estilos de saída: msdn.microsoft.com/en-us/library/ms187928.aspx
Ben Fransen
Código 126 é bom para as datas, tais como uma data de nascimento em formato-AAAA-mm dd: Converter (CHAR (10), pat_dob, 126) como pat_dob
jjwdesign
118
SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM

SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  

SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           

SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy

SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy

SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy

SELECT convert(varchar, getdate(), 106) -- dd mon yyyy

SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy

SELECT convert(varchar, getdate(), 108) -- hh:mm:ss

SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)

SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy

SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd

SELECT convert(varchar, getdate(), 112) -- yyyymmdd

SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm

SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm

SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
Imran
fonte
1
como obter 'm / d / aaaa' em vez 'mm / dd / aaaa'
user_az
Esta é a resposta mais útil, de longe.
Daniel
109

Começando com o SQL Server 2012 (a pergunta original é para 2000):

SELECT FORMAT(GetDate(), 'yyyy-MM-dd')

Ignas Vyšnia
fonte
Essa é a maneira flexível e flexível de fazer a data / hora nas versões recentes do SQL usando os formatos padrão do Dotnet. Lembre-se de colocar em maiúscula o mês MM para distinguir dos minutos. Todos os formatos de data e hora
jim birch
FORMAT é executado (geralmente) 43 vezes mais lento que CONVERT. Eu recomendo fortemente que você nunca (e não uso essa palavra com frequência) use FORMAT.
Jeff Moden
35

O formulário que você procura está listado na documentação online dos livros.

http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

Por exemplo, tente o seguinte:

select convert(varchar,getDate(),120)
select convert(varchar(10),getDate(),120)
John Sansom
fonte
4
Se você escolher o padrão, nesse caso, obterá o valor da hora - todo o formato do formato 120 é 'aaaa-mm-dd hh: mi: ss'. Ao declarar explicitamente o comprimento, ele é aparado no formato especificado na sua nota original - 'aaaa-mm-dd'.
209 DaveE
26

A convertfunção com o especificador de formato 120 fornecerá o formato "aaaa-MM-dd HH: mm: ss", portanto, basta limitar o comprimento a 10 para obter apenas a parte da data:

convert(varchar(10), theDate, 120)

No entanto, geralmente é melhor fazer a formatação de datas na camada de apresentação do que na camada de banco de dados ou de negócios. Se você retornar a data formatada no banco de dados, o código do cliente precisará analisá-la novamente para uma data se precisar fazer cálculos.

Exemplo em C #:

theDate.ToString("yyyy-MM-dd")
Guffa
fonte
1
Por que o voto negativo? Se você não explicar o que acha que está errado, não poderá melhorar a resposta.
Guffa
14

Para AAAAMMDD, tente

select convert(varchar,getDate(),112)

Eu testei apenas no SQLServer2008.

LosManos
fonte
7

Uma outra maneira ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
Athadu
fonte
1
Isso criará datas de 1 dígito, como em 3/8/2012, se você quiser 2 dígitos mm / dd, precisará colocar as datas à esquerda. RIGHT ('00 '+ CONVERT (varchar, DATEPART (aaaa, @datetime)), 2) por exemplo
MindStalker
7

Para aqueles que desejam a parte do tempo também (eu queria), o seguinte snippet pode ajudar

SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                              --example -- 2008-10-02T10:52:47.513
user2431693
fonte
6
replace(convert(varchar, getdate(), 111), '/','-')

Também fará truques sem "cortar nada".

Rafael Emshoff
fonte
Prefiro esta versão para evitar erros do "ano 9999" associados à versão convert (varchar (10) ...).
Francis Huang
6

Caso alguém queira fazer o contrário e encontrar isso.

select convert(datetime, '12.09.2014', 104)

Isso converte uma sequência no formato de data em alemão em um objeto de data e hora.

Por que 104? Consulte aqui: http://msdn.microsoft.com/en-us/library/ms187928.aspx

Jenny O'Reilly
fonte
5

No link de conversão e conversão, use o estilo 126 da seguinte maneira:

CONVERT (varchar(10), DTvalue, 126)

Isso trunca o tempo. Seu requisito para tê-lo em aaaa-mm-dd significa que ele deve ser um tipo de dados e data / hora da cadeia de caracteres.

Francamente, eu faria isso no cliente, a menos que você tenha boas razões para não fazê-lo.

gbn
fonte
4

Se você quiser usá-lo como uma data em vez de varcharnovamente depois, não se esqueça de convertê-lo novamente:

select convert(datetime,CONVERT(char(10), GetDate(),126))
Wayne Evans
fonte
isso não o converteria de volta ao formato padrão do sistema?
Ignas Vyšnia
3

Não sei por que a maneira mais simples foi ignorada / omitida nas respostas acima:

SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02

SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08

Eu prefiro o segundo porque qualquer que seja o idioma que você fale, você entenderá em que data é!

Além disso, o SQL Server sempre o 'entende' quando você o envia para o procedimento de salvamento, independentemente de quais formatos regionais estão definidos nos computadores - eu sempre uso o ano inteiro (aaaa), o nome do mês (MMM) e o formato de 24 horas (HH maiúsculo) por uma hora na minha programação.

Hannington Mambo
fonte
2

SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)

Dmitri Kouminov
fonte
1
por que usar o NVARCHAR (20)? poderia haver caracteres especiais lá?
KM.
Eu pretendo usar UNICODE. Mos de meus projetos ;-) internacional
Dmitri Kouminov
2

Você também pode usar. Isso ocorre usando o novo tipo de dados DATE. Pode não funcionar em todas as versões anteriores, mas muito simplificado para uso na versão posterior.

SELECT CAST(getdate() AS DATE)
SELECT LEFT(CAST(getdate() AS DATE), 7)
Sams
fonte
1

Eu usaria:

CONVERT(char(10),GETDATE(),126)
KM.
fonte
1
SELECT Code,Description FROM TABLE

-- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))

-- This will Include the whole day of 14th March 2010
--WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))
arun.passioniway
fonte
1

No SQL Server 2008, você pode fazer isso: CONVERT(date,getdate())

Asher
fonte
1

Parece desnecessário fazer coisas estranhas, se você quiser que sua data seja separada por uma barra. Apenas escape com uma barra invertida. Caso contrário, você terminará com um ponto.

SELECT FORMAT(GETDATE(),'yyyy\/MM');  

Testado no SQL Server 2016

cuilster
fonte
Você deve testá-lo quanto ao desempenho. O FORMATO geralmente é 43 vezes mais lento do que até um CONVERTO complicado.
Jeff Moden
0

Usar uma instrução CASE para cada uma das funções de conversão / conversão sempre funciona para mim:

Substitua tableXXXXY pelo nome da sua tabela e issueDate_dat pelo nome do seu campo datetime nessa tabela:

SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
, CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
, CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
FROM            tableXXXXY

Espero que isso tenha sido útil. Chagbert.

Chagbert
fonte
0

Esta solução funciona para mim, simples e eficaz (também com 126)

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
anfehernandez94
fonte
0

Se o seu formato de data de origem estiver todo bagunçado, tente algo como:

select
convert(nvarchar(50),year(a.messedupDate))+'-'+
(case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
    else convert(nvarchar(50),month(a.messedupDate)) end)+
(case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
    then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
    else convert(nvarchar(50),day(a.messedupDate)) end) 
from messytable a
CArnold
fonte
0
 IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);

cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;
Raj Kumar
fonte
Código de cima é utilizado para fornecer um procedimento de armazenamento de parâmetro na forma de mm / dd / aaaa
Raj Kumar