Como devolver apenas a data a partir de um DateTime datatype do servidor SQL
SELECT GETDATE()
O Devolve: 2008-09-22 15:24:13.790
2008-09-22 00:00:00.000
Como posso conseguir isso?
30 answers
Em SQL Server 2008
e mais, deve CONVERT
até à data:
SELECT CONVERT(date, getdate())
Em versões mais antigas, pode fazer o seguinte:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
Por exemplo
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Dá-me
2008-09-22 00:00:00.000
Prós:
- não
varchar
datetime
conversões necessárias
Não há necessidade de pensar em
locale
O SQLServer 2008 tem agora um tipo de dados "data" que contém apenas uma data sem componente de hora. Qualquer pessoa que utilize o SQLServer 2008 e mais além pode fazer o seguinte:
SELECT CONVERT(date, GETDATE())
Se utilizar SQL 2008 ou superior:
select cast(getdate() as date)
DATEADD e DATEDIFF são melhores do que converter para varchar. Ambas as consultas têm o mesmo plano de execução, mas os planos de execução são primariamente sobre data estratégias de acesso e nem sempre revelam custos implícitos envolvidos no tempo de CPU para executar todas as peças. Se ambas as consultas são executadas contra uma tabela com milhões de linhas, o tempo de CPU usando DateDiff pode ser próximo de 1/3 do tempo de CPU Converter!
Para ver os planos de execução das consultas:
set showplan_text on
GO
Ambos DATEADD e DATEDIFF irão executar um CONVERT_ IMPLICT.
Embora a solução CONVERT seja mais simples e fácil de ler para alguns, é mais lenta. Não há necessidade de voltar ao datetime (isto é implicitamente feito pelo servidor). Também não há necessidade real no método de DateDiff para DateAdd depois, pois o resultado inteiro também será implicitamente convertido de volta para datetime.
Seleccione Converter (varchar, Data, 101) de DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
Seleccione o DATEADD(dd, 0, DATEDIFF (dd, 0, MyDate)) do DatesTable
|--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
|--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
Usar o chão () como @digi sugeriu tem desempenho mais próximo do DateDiff, mas não é recomendado como o tipo de dados datetime para flutuar e recuar nem sempre produz o valor original.
Lembrem-se, não acreditem em ninguém. Olhe para as estatísticas de desempenho, e testá-lo você mesmo! Tem cuidado quando testares os resultados. Seleccionar muitos as linhas para o cliente irão esconder a diferença de desempenho porque leva mais tempo para enviar as linhas sobre a rede do que para realizar os cálculos. Então certifique-se de que o trabalho para todas as linhas é feito pelo servidor, mas não há rowset enviado para o cliente.Parece haver confusão para algumas pessoas sobre quando a otimização de cache afeta consultas. Executar duas consultas no mesmo lote ou em lotes separados não tem efeito sobre a cache. Então você pode expirar a cache manualmente ou simplesmente executar as consultas para trás e para a frente várias vezes. Qualquer otimização para a consulta #2 também afetaria quaisquer consultas subsequentes, então jogue fora a execução # 1 Se você quiser.
Tenta isto:
SELECT CONVERT(VARCHAR(10),GETDATE(),111)
A instrução acima converte o seu formato actual em YYYY/MM/DD
, por favor consulte esta ligação para escolher o seu formato preferível.
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Para devolução no formato da data
Elenco (OrderDate AS date)
O código acima irá funcionar no servidor sql 2010
Ele vai voltar como 12/12/2013
Para o servidor SQL 2012 utilize o código abaixo
CONVERT(VARCHAR(10), OrderDate , 111)
Pode usar a função CONVERT
para devolver apenas a data. Ver a(s) ligação (ões) abaixo:
Manipulação de data e hora no servidor SQL 2000
A sintaxe para usar a função convert é:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21
SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
Se quiser usar o CONVERT e obter a mesma saída que na pergunta original colocada, isto é, AAAA-mm-dd, então use CONVERT(varchar(10),[SourceDate as dateTime],121)
o mesmo código que as respostas do casal anterior, mas o código para converter para AAAA-mm-dd com traços é 121.
Deves sempre ir em frente e devolver o teu tipo de dados dateTime do programa chamador e no nível de apresentação, fazer os ajustes necessários. Assim que você vai converter as coisas antes de devolvê-las para o chamador, Você está removendo toda a esperança de integridade referencial da aplicação. Isso evitaria uma operação de atualização ou exclusão, novamente, a menos que você faça algum tipo de reversão manual, que novamente está expondo seus dados a erro humano/code/gremlin quando não há necessidade.
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
Editar: os dois primeiros métodos são essencialmente os mesmos, e para fora executar o método converter para varchar.
Para obter o resultado indicado, uso o seguinte comando.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Acho que é útil.
Se estiver a utilizar SQL Server 2012 ou versões acima,
Utilizar Format()
função.
Já existem várias respostas e tipos de formatação para o servidor SQL. Mas a maioria dos métodos são um pouco ambíguos e seria difícil para você lembrar os números para o tipo de formato ou funções no que diz respeito ao formato de data específica. É por isso que nas próximas versões do servidor SQL há uma melhor opção.
FORMAT ( value, format [, culture ] )
A opção cultura é muito útil, pois você pode especificar a data de acordo com os seus telespectadores.
Você tem que lembrar d (para padrões pequenos) e D (para padrões longos).
1."d" - Padrão de datas curtas.
2009-06-15T13:45:30 -> 6/15/2009 (en-US)
2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)
2."D" - Padrão de data longa.
2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)
Mais exemplos na consulta.
DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result';
SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';
US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result
---------------- ----------------------------- ------------- -------------------------------------
10/1/2011 01/10/2011 01.10.2011 2011/10/1
US English Result Great Britain English Result German Result Chinese (Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- ---------------------------------------
Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日
Se quiser mais formatos, pode ir para:
Convert(nvarchar(10), getdate(), 101) ---> 5/12/14
Convert(nvarchar(12), getdate(), 101) ---> 5/12/2014
Se precisar de resultados no tipo de dados varchar, deve passar por
SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
Que já foi mencionado acima
Se precisar de um resultado no formato de data e hora, deve passar por qualquer uma das consultas abaixo
1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111))
Como Data única --2014-03-26 00:00:00.000
2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112))
Como Data única --2014-03-26 00:00:00.000
3)
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
--2014-03-26 00:00:00.000
Se você está atribuindo os resultados a uma coluna ou variável, dê-lhe o tipo de data, e a conversão está implícita.
DECLARE @Date DATE = GETDATE()
SELECT @Date --> 2017-05-03
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
OK, embora eu esteja um pouco atrasado :), aqui está a outra solução.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
Resultado
2008-09-22 00:00:00.000
E se estiver a usar o SQL Server 2012 e mais alto, então poderá usar a função FORMAT()
como esta -
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Mesmo usando o antigo servidor MSSQL 7.0, o código aqui (cortesia deste link ) permitiu-me obter qualquer formato de data que eu estava à procura na altura:
PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())
PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)
PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110)
PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6)
PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)
Produziu esta Produção:
1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015 1:14PM
2) Date/time in format MM-DD-YY: 02-27-15
3) Date/time in format MM-DD-YYYY: 02-27-2015
4) Date/time in format DD MON YYYY: 27 Feb 2015
5) Date/time in format DD MON YY: 27 Feb 15
6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'
SELECT CONVERT(DATE, @yourdate)
DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
{[[2]} Ele também não se importa com local ou fazer uma conversão dupla -- embora cada 'datepart' provavelmente faz matemática. Então pode ser um pouco mais lento do que o método datediff, mas para mim é muito mais claro. Especialmente quando eu quero grupo por apenas o ano e mês (definir o dia para 1).
Data:
SELECT CONVERT(date, GETDATE()) SELECT CAST(GETDATE() as date)
Tempo:
SELECT CONVERT(time , GETDATE() , 114) SELECT CAST(GETDATE() as time)
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')
No servidor SQL 2000
CAST(
(
STR( YEAR( GETDATE() ) ) + '/' +
STR( MONTH( GETDATE() ) ) + '/' +
STR( DAY( GETDATE() ) )
)
AS DATETIME)
Porque não usa DATE_FORMAT (your_ datetiem_ column, '%d-%m-%Y' ) ?
EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name
Pode mudar a sequência de m, d e ano re-organizando '%d-%m-%Y'
parte
Isto estava faltando em todas as respostas, pode não ser o mais eficiente, mas muito fácil de escrever e entender, nenhum estilo necessário, nenhuma função de data complexa.
SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
Simplesmente podes fazer assim:
SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
Saídas como:
2008-09-22 00:00:00.000
Ou simplesmente fazer assim:
SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
Resultado:
Date Part Only
--------------
2013-07-14
Pode usar o seguinte para a parte da data e formatar a data:
DATENAME => Devolve um texto de caracteres que representa o conjunto de dados indicado da data indicada
DATEADD = > a função DATEPART()
é usada para devolver uma única parte de uma data/hora, tais como Ano, Mês, Dia, Hora, Minuto, etc.
DATEPART =>Devolve um inteiro que representa o datepart indicado da data indicada.
CONVERT()
= > a função CONVERT()
é uma função geral que converte uma expressão de um tipo de dados para outro.
O
CONVERT()
a função pode ser usada para mostrar dados de data / hora em diferentes formatos.
Date (date&time field) and DATE_ format (date&time,' % Y - %m - %d') ambos devolve only date from date&time
}