Estou trabalhando em uma consulta no Sql Server 2005 em que preciso converter um valor em DateTime
variável em uma varchar
variável em yyyy-mm-dd
formato (sem parte do tempo). Como faço isso?
Estou trabalhando em uma consulta no Sql Server 2005 em que preciso converter um valor em DateTime
variável em uma varchar
variável em yyyy-mm-dd
formato (sem parte do tempo). Como faço isso?
Respostas:
Com o Microsoft Sql Server:
--
-- Create test case
--
DECLARE @myDateTime DATETIME
SET @myDateTime = '2008-05-03'
--
-- Convert string
--
SELECT LEFT(CONVERT(VARCHAR, @myDateTime, 120), 10)
LEFT(.., 10)
vez de CONVERT(CHAR(10), ...)
? Além disso, aqueles que trabalham com as versões mais recentes do SQL Server que 2005 (!) Devem verificar a resposta de Zar Shardan, sugerindo uma solução baseada na FORMAT(date_value, format_string)
função.
FORMAT()
é relativo muito lento paraconvert(char(10),...)
Aqui estão alguns sql de teste para todos os estilos.
DECLARE @now datetime
SET @now = GETDATE()
select convert(nvarchar(MAX), @now, 0) as output, 0 as style
union select convert(nvarchar(MAX), @now, 1), 1
union select convert(nvarchar(MAX), @now, 2), 2
union select convert(nvarchar(MAX), @now, 3), 3
union select convert(nvarchar(MAX), @now, 4), 4
union select convert(nvarchar(MAX), @now, 5), 5
union select convert(nvarchar(MAX), @now, 6), 6
union select convert(nvarchar(MAX), @now, 7), 7
union select convert(nvarchar(MAX), @now, 8), 8
union select convert(nvarchar(MAX), @now, 9), 9
union select convert(nvarchar(MAX), @now, 10), 10
union select convert(nvarchar(MAX), @now, 11), 11
union select convert(nvarchar(MAX), @now, 12), 12
union select convert(nvarchar(MAX), @now, 13), 13
union select convert(nvarchar(MAX), @now, 14), 14
--15 to 19 not valid
union select convert(nvarchar(MAX), @now, 20), 20
union select convert(nvarchar(MAX), @now, 21), 21
union select convert(nvarchar(MAX), @now, 22), 22
union select convert(nvarchar(MAX), @now, 23), 23
union select convert(nvarchar(MAX), @now, 24), 24
union select convert(nvarchar(MAX), @now, 25), 25
--26 to 99 not valid
union select convert(nvarchar(MAX), @now, 100), 100
union select convert(nvarchar(MAX), @now, 101), 101
union select convert(nvarchar(MAX), @now, 102), 102
union select convert(nvarchar(MAX), @now, 103), 103
union select convert(nvarchar(MAX), @now, 104), 104
union select convert(nvarchar(MAX), @now, 105), 105
union select convert(nvarchar(MAX), @now, 106), 106
union select convert(nvarchar(MAX), @now, 107), 107
union select convert(nvarchar(MAX), @now, 108), 108
union select convert(nvarchar(MAX), @now, 109), 109
union select convert(nvarchar(MAX), @now, 110), 110
union select convert(nvarchar(MAX), @now, 111), 111
union select convert(nvarchar(MAX), @now, 112), 112
union select convert(nvarchar(MAX), @now, 113), 113
union select convert(nvarchar(MAX), @now, 114), 114
union select convert(nvarchar(MAX), @now, 120), 120
union select convert(nvarchar(MAX), @now, 121), 121
--122 to 125 not valid
union select convert(nvarchar(MAX), @now, 126), 126
union select convert(nvarchar(MAX), @now, 127), 127
--128, 129 not valid
union select convert(nvarchar(MAX), @now, 130), 130
union select convert(nvarchar(MAX), @now, 131), 131
--132 not valid
order BY style
Aqui está o resultado
output style
Apr 28 2014 9:31AM 0
04/28/14 1
14.04.28 2
28/04/14 3
28.04.14 4
28-04-14 5
28 Apr 14 6
Apr 28, 14 7
09:31:28 8
Apr 28 2014 9:31:28:580AM 9
04-28-14 10
14/04/28 11
140428 12
28 Apr 2014 09:31:28:580 13
09:31:28:580 14
2014-04-28 09:31:28 20
2014-04-28 09:31:28.580 21
04/28/14 9:31:28 AM 22
2014-04-28 23
09:31:28 24
2014-04-28 09:31:28.580 25
Apr 28 2014 9:31AM 100
04/28/2014 101
2014.04.28 102
28/04/2014 103
28.04.2014 104
28-04-2014 105
28 Apr 2014 106
Apr 28, 2014 107
09:31:28 108
Apr 28 2014 9:31:28:580AM 109
04-28-2014 110
2014/04/28 111
20140428 112
28 Apr 2014 09:31:28:580 113
09:31:28:580 114
2014-04-28 09:31:28 120
2014-04-28 09:31:28.580 121
2014-04-28T09:31:28.580 126
2014-04-28T09:31:28.580 127
28 جمادى الثانية 1435 9:31:28:580AM 130
28/06/1435 9:31:28:580AM 131
Faça nvarchar(max)
mais curto para aparar o tempo. Por exemplo:
select convert(nvarchar(11), GETDATE(), 0)
union select convert(nvarchar(max), GETDATE(), 0)
saídas:
May 18 2018
May 18 2018 9:57AM
dd-mm
ou jun - 28
. Existe alguma opção ??
Tente o seguinte:
CONVERT(varchar(10), [MyDateTimecolumn], 20)
Por um período de data completo e não apenas por data, faça:
CONVERT(varchar(23), [MyDateTimecolumn], 121)
Veja esta página para estilos de conversão:
http://msdn.microsoft.com/en-us/library/ms187928.aspx
OU função
SQL Server CONVERT ()
O SQL Server 2012 tem uma nova função, FORMAT: http://msdn.microsoft.com/en-us/library/ee634924.aspx
e você pode usar seqüências de caracteres de formato de data e hora personalizadas: http://msdn.microsoft.com/en-us/library/ee634398.aspx
Essas páginas sugerem que também está disponível no SQL2008R2, mas não tenho uma útil para testar se esse é o caso.
Exemplo de uso (data e hora australiana):
FORMAT(VALUE,'dd/MM/yyyy h:mm:ss tt')
De qualquer Cast
ou Convert
:
Sintaxe para CAST
:
CAST ( expression AS data_type [ (length ) ])
Sintaxe para CONVERT
:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
http://msdn.microsoft.com/en-us/library/ms187928.aspx
Na verdade, desde que você solicitou um formato específico:
REPLACE(CONVERT(varchar(10), Date, 102), '.', '-')
Com o Microsoft SQL Server:
Use a sintaxe para o CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
Exemplo:
SELECT CONVERT(varchar,d.dateValue,1-9)
Para o estilo, você pode encontrar mais informações aqui: MSDN - Transmitir e converter (Transact-SQL) .
Tente o seguinte:
CONVERT(VARCHAR(10),GetDate(),102)
Então você precisaria substituir o "." com "-".
Aqui está um site que ajuda http://www.mssqltips.com/tip.asp?tip=1145
declare @dt datetime
set @dt = getdate()
select convert(char(10),@dt,120)
Eu fixei o comprimento dos dados char(10)
conforme você deseja um formato de string específico.
Você pode converter sua data em vários formatos, a sintaxe é simples de usar:
CONVERT('TheTypeYouWant', 'TheDateToConvert', 'TheCodeForFormating' * )
CONVERT(NVARCHAR(10), DATE_OF_DAY, 103) => 15/09/2016
No seu caso , eu acabei de converter e restringir o tamanho por nvarchar (10) assim:
CONVERT(NVARCHAR(10), MY_DATE_TIME, 120) => 2016-09-15
Veja mais em: http://www.w3schools.com/sql/func_convert.asp
Outra solução (se a sua data é uma data e hora) é um CAST simples :
CAST(MY_DATE_TIME as DATE) => 2016-09-15
Para SQL Server 2008+, você pode usar CONVERT e FORMAT juntos.
Por exemplo, para carimbo de data / hora de estilo europeu (por exemplo, Alemanha):
CONVERT(VARCHAR, FORMAT(GETDATE(), 'dd.MM.yyyy HH:mm:ss', 'de-DE'))
Você não disse qual banco de dados, mas com o mysql aqui é uma maneira fácil de obter uma data com um carimbo de data / hora (e a conversão do tipo varchar deve ocorrer automaticamente):
mysql> select date(now());
+-------------+
| date(now()) |
+-------------+
| 2008-09-16 |
+-------------+
1 row in set (0.00 sec)
A maneira mais curta e mais simples é:
DECLARE @now AS DATETIME = GETDATE()
SELECT CONVERT(VARCHAR, @now, 23)
select REPLACE(CONVERT(VARCHAR, FORMAT(GETDATE(), N'dd/MM/yyyy hh:mm:ss tt')),'.', '/')
vai dar 05/05/2020 10:41:05 AM
como resultado
Você não diz qual idioma, mas suponho C#/.NET
que ele tenha um DateTime
tipo de dados nativo . Nesse caso, basta convertê-lo usando o ToString
método e use um especificador de formato como:
DateTime d = DateTime.Today;
string result = d.ToString("yyyy-MM-dd");
No entanto, eu recomendaria não usar isso em uma consulta ao banco de dados ou concatenado em uma instrução SQL. Os bancos de dados exigem que uma seqüência de formatação específica seja usada. É melhor zerar a parte do tempo e usar o DateTime como um parâmetro SQL, se é isso que você está tentando realizar.
CONVERT
, consulte a documentação do MSDN .