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

Quero a parte da data sem a parte do tempo.: 2008-09-22 00:00:00.000

Como posso conseguir isso?

Author: TylerH, 2008-09-22

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 varchardatetime conversões necessárias
  • Não há necessidade de pensar em locale
 2122
Author: aku, 2018-03-26 05:56:30

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())
 665
Author: BenR, 2016-04-18 15:03:53

Se utilizar SQL 2008 ou superior:

select cast(getdate() as date)
 145
Author: abatishchev, 2016-03-29 23:11:59

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.

Aqui está script de teste completo e resultados de desempenho {[36] } que provam que DateDiff é substancialmente mais rápido do que converter para varchar.

 69
Author: Ricardo C, 2017-05-23 12:34:53

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.

 42
Author: Nescio, 2018-09-14 11:10:54
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
 36
Author: Cade Roux, 2011-01-31 09:45:20

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)
 18
Author: Mahesh ML, 2014-08-27 08:36:04

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

Moldado e convertido

A sintaxe para usar a função convert é:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
 18
Author: DaveK, 2015-04-14 11:45:09
Usando o chão, corta a parte do tempo.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
 12
Author: DiGi, 2008-09-22 07:38:59
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
 12
Author: Rushda, 2017-01-27 21:10:23

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.

Se conseguir entrar na minha caixa de sabão por um segundo, este tipo de formatação não pertence ao nível de dados, e é por isso que não foi possível sem "truques" ridículos até o SQL Server 2008, quando os tipos reais de dados do datepart são adicionar. Fazer tais conversões na camada de dados é um enorme desperdício de sobrecarga em seu DBMS, mas mais importante, no segundo em que você faz algo como isso, você basicamente criou em memória dados órfãos que eu assumo que você vai voltar para um programa. Você não pode colocá-lo de volta em outra coluna 3NF+ ou compará-lo com qualquer coisa digitada sem reverter, então tudo o que você fez foi introduzir pontos de falha e remover referência relacional.

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.

 11
Author: Focusyn, 2012-07-26 20:00:30
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.

 10
Author: Gordon Bell, 2016-03-29 22:42:55

Para obter o resultado indicado, uso o seguinte comando.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Acho que é útil.
 9
Author: Anderson Silva, 2016-03-29 22:54:44

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:

  1. Textos De Formato-Padrão de data e hora
  2. textos personalizados do formato da data e da hora
 9
Author: Somnath Muluk, 2016-09-20 05:26:36
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
 8
Author: Ankit Khetan, 2015-06-06 12:27:44

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

 8
Author: Stephon Johns, 2016-03-29 22:54:51

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
 7
Author: Art Schmidt, 2017-05-03 16:05:44
Acho que isto funcionaria no seu caso.
CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
 6
Author: bishnu karki, 2013-11-27 06:44:56

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')
 6
Author: Krishnraj Rana, 2016-04-13 10:46:30

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
 5
Author: Matt O'Brien, 2015-02-27 21:16:05
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
 5
Author: etni, 2016-03-30 00:21:57
Sou a favor do seguinte que não foi mencionado:
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).
 4
Author: Gerard ONeill, 2016-03-29 22:52:24

Data:

SELECT CONVERT(date, GETDATE())
SELECT CAST(GETDATE() as date)

Tempo:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)
 4
Author: Kris Khairallah, 2016-05-21 09:24:33
A partir do SQL SERVER 2012, pode fazer isto:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

 4
Author: xbb, 2016-07-20 15:58:29

No servidor SQL 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)
 4
Author: kaub0st3r, 2017-06-21 06:27:47

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

 3
Author: Janaka R Rajapaksha, 2014-05-17 05:46:19

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()))))
 3
Author: Random_Dev, 2016-03-29 22:54:37

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
 3
Author: Amar Srivastava, 2017-09-08 09:01:49

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.

 2
Author: user1151326, 2014-03-29 16:12:51

Date (date&time field) and DATE_ format (date&time,' % Y - %m - %d') ambos devolve only date from date&time

}
 2
Author: Surekha, 2015-07-08 06:28:44