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.


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.


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

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


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)

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

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.


7

Uma outra maneira ...

CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 

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

6
replace(convert(varchar, getdate(), 111), '/','-')

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


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


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.


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

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.


2

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


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)

1

Eu usaria:

CONVERT(char(10),GETDATE(),126)

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

1

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


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


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.


0

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

CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)

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

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;

Código de cima é utilizado para fornecer um procedimento de armazenamento de parâmetro na forma de mm / dd / aaaa
Raj Kumar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.