Como converter uma data e hora em string no T-SQL

89

Estou surpreso por ainda não conseguir encontrar essa pergunta aqui.

Eu tenho uma data e hora var e quero convertê-la em uma string para poder anexá-la a outra string. Eu quero um formato que possa ser facilmente convertido de volta para uma data e hora.

Como posso fazer isso?

(Eu quero a parte da data e a parte da hora.)

cja
fonte
@TonyHopkinson Também recebi muitos acessos, mas todos pareciam estar convertendo para o outro lado. Ou querendo algo mais complicado.
cja
3
Digite Convert, clique duas vezes para destacar, pressione Shift + F1 ... sempre a primeira linha de defesa.
Eric J. Price

Respostas:

154

A consulta a seguir obterá a data e hora atual e converterá em string. com o seguinte formato
yyyy-mm-dd hh:mm:ss(24h)

SELECT convert(varchar(25), getdate(), 120) 
John Woo
fonte
47
Ainda não consigo superar o fato de que você tem que passar números arbitrários para obter o formato correto
cja
4
@cja Eu compartilho totalmente sua surpresa. Desejo fornecer uma string, como yyddss, para obter o formato exato que desejo. Provavelmente há uma razão técnica ou histórica para isso. Mas ainda assim - muito surpreendente.
Konrad Viltersten
2
Obrigado pela solução rápida, mas em sua resposta você está codificando os meses como minutos, aaaa-MM-dd hh: mm: ss NÃO aaaa-mm-dd hh: mm: ss
Tom Martin
Embora isso seja antigo, acabei de encontrar este tópico. Ao usar DateTimeOffSet, certifique-se de ajustar o varcharcomprimento de acordo com a aparência desejada para o resultado. Para mim, eu não queria o fuso horário, então tive que usarSELECT convert(varchar(19), sysdatetimeoffset(), 120)
RoLYroLLs
30

Existem muitas maneiras diferentes de convertum datetimepara um string. Aqui está uma maneira:

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

Veja a demonstração

Aqui está um site que contém uma lista de todas as conversões:

Como formatar data e hora no SQL Server

Taryn
fonte
7

Você pode usar a convertinstrução no Microsoft SQL Server para converter uma data em uma string. Um exemplo da sintaxe usada seria:

SELECT convert(varchar(20), getdate(), 120)

O código acima retornaria a data e hora atuais em uma string com o formato de YYYY-MM-DD HH:MM:SSrelógio de 24 horas.

Você pode alterar o número no final da instrução para um de muitos que irão alterar o formato das strings retornadas. Uma lista desses códigos pode ser encontrada no MSDN na seção de referência CAST e CONVERT .

Jeremy1026
fonte
6

Existem 3 métodos diferentes, dependendo de qual é a minha necessidade e da versão que estou usando.

Aqui estão os métodos ..

1) Usando Converter

DECLARE @DateTime DATETIME = GETDATE();
--Using Convert
SELECT
    CONVERT(NVARCHAR, @DateTime,120) AS 'myDateTime'
    ,CONVERT(NVARCHAR(10), @DateTime, 120) AS 'myDate'
    ,RIGHT(CONVERT(NVARCHAR, @DateTime, 120),8) AS 'myTime'

2) Usando Cast (SQL Server 2008 e além)

SELECT
    CAST(@DateTime AS DATETIME2) AS 'myDateTime'
    ,CAST(@DateTime AS DATETIME2(3)) AS 'myDateTimeWithPrecision'
    ,CAST(@DateTime AS DATE) AS 'myDate'
    ,CAST(@DateTime AS TIME) AS 'myTime'
    ,CAST(@DateTime AS TIME(3)) AS 'myTimeWithPrecision'

3) Usando tipo de dados de caractere de comprimento fixo

DECLARE @myDateTime NVARCHAR(20) = CONVERT(NVARCHAR, @DateTime, 120);
DECLARE @myDate NVARCHAR(10) = CONVERT(NVARCHAR, @DateTime, 120);

SELECT
    @myDateTime AS 'myDateTime'
    ,@myDate AS 'myDate'
Todd.J.Hayden
fonte
4

Além das funções CASTe CONVERTnas respostas anteriores, se você estiver usando o SQL Server 2012 e superior, use a função FORMAT para converter um DATETIMEtipo baseado em uma string.

Para converter de volta, use as funções opostas PARSEou TRYPARSE.

Os estilos de formatação são baseados em .NET (semelhante às opções de formatação de string do método ToString ()) e tem a vantagem de reconhecer a cultura. por exemplo.

DECLARE @DateTime DATETIME2 = SYSDATETIME();
DECLARE @StringResult1 NVARCHAR(100) = FORMAT(@DateTime, 'g') --without culture
DECLARE @StringResult2 NVARCHAR(100) = FORMAT(@DateTime, 'g', 'en-gb') 
SELECT @DateTime
SELECT @StringResult1, @StringResult2
SELECT PARSE(@StringResult1 AS DATETIME2)
SELECT PARSE(@StringResult2 AS DATETIME2 USING 'en-gb')

Resultados:

2015-06-17 06:20:09.1320951
6/17/2015 6:20 AM
17/06/2015 06:20
2015-06-17 06:20:00.0000000
2015-06-17 06:20:00.0000000
g2server
fonte
Estou faltando alguma coisa ou o problema de OPs foi resolvido com FORMAT (<date var>, 'dd MMMM aaaa HH: mm: ss') ou qualquer formato de data personalizado que você precisa ?!
Grim
@Grim, você também pode fazer isso. Dos documentosThe format argument must contain a valid .NET Framework format string, either as a standard format string (for example, "C" or "D"), or as a pattern of custom characters for dates and numeric values (for example, "MMMM DD, yyyy (dddd)")
g2server
Acho que você está realmente trabalhando muito aqui. O SQL Server tem equivalentes de string implícitos para DATETIME2. O que você está realmente fazendo aqui é utilizar a conversão implícita e, em seguida, formatar a string resultante, não a data e hora.
Jamie Marshall
@JamieMarshall mais ou menos. MSDN sugere:Use the FORMAT function for locale-aware formatting of date/time and number values as strings. For general data type conversions, use CAST or CONVERT.
g2server
1
SELECT CONVERT(varchar, @datetime, 103) --for UK Date format 'DD/MM/YYYY'

101 - EUA - MM / DD / AAAA

108 - Tempo - HH: MI: SS

112 - Data - AAAAMMDD

121 - ODBC - AAAA-MM-DD HH: MI: SS.FFF

20 - ODBC - AAAA-MM-DD HH: MI: SS

Rajsanthosh Sreenivasan
fonte
1

Muitas pessoas responderam a essa pergunta, mas acho que a solução mais simples foi deixada de lado.

SQL SERVER (acredito que seja 2012+) tem equivalentes de string implícitos para DATETIME2, conforme mostrado aqui

Veja a seção sobre "Formatos de literal de string suportados para datetime2"

Para responder à pergunta dos OPs explicitamente:

DECLARE @myVar NCHAR(32)
DECLARE @myDt DATETIME2
SELECT @myVar = @GETDATE()
SELECT @myDt = @myVar
PRINT(@myVar)
PRINT(@myDt)

resultado:

Jan 23 2019 12:24PM             
2019-01-23 12:24:00.0000000

Observação: a primeira variável ( myVar) também contém o valor '2019-01-23 12:24:00.0000000'. Ele apenas é formatado Jan 23 2019 12:24PMdevido à formatação padrão definida para SQL SERVER, que é chamada quando você usa PRINT. Não se deixe enganar aqui por isso, a string real em (myVer)='2019-01-23 12:24:00.0000000'

Jamie Marshall
fonte
0

Experimente abaixo:

DECLARE @myDateTime DATETIME
SET @myDateTime = '2013-02-02'

-- Convert to string now
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
Gaurav123
fonte
1
Boa !! Precisamos escrever LEFT também?
Gaurav123
Leva 10 primeiros caracteres, então se você precisar se quiser apenas a data.
ram4 de