Cómo devolver solo la fecha de un tipo de datos DateTime de SQL Server

SELECT GETDATE()

Devoluciones: 2008-09-22 15:24:13.790

Quiero esa parte de la fecha sin la parte del tiempo: 2008-09-22 00:00:00.000

¿Cómo puedo conseguirlo?

preguntado el 22 de septiembre de 08 a las 01:09

Si está buscando obtener un tipo de datos de fecha sin la hora, incluso si la hora es 00:00:00, entonces no tiene suerte, puede obtener un varchar pero la estructura es una fecha y hora y siempre tendrá algo de tiempo. -

Una cosa a tener en cuenta es que SQL Server 2008 incluye un tipo de datos DATE separado para almacenar solo fechas sin el componente de hora. Más info aquí: sql-server-rendimiento.com/articles/dev/datetime_2008_p1.aspx -

No se pierda esta publicación mostrando los resultados de las pruebas de rendimiento de los distintos métodos de eliminación de tiempo. -

No se deje engañar por los votos y la respuesta aceptada, eche un vistazo a stackoverflow.com/a/126984/1155650 -

@Rohit Está asumiendo incorrectamente que 2008 es la única versión que le importa a la gente. (Hay más versiones en la naturaleza). Los votos hablan por sí mismos. -

30 Respuestas

On SQL Server 2008 y más alto, deberías CONVERT hasta la fecha:

SELECT CONVERT(date, getdate())

En versiones anteriores, puede hacer lo siguiente:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))

por ejemplo

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

me da

2008-09-22 00:00:00.000

Pros:

  • No varchar<->datetime conversiones requeridas
  • No hay necesidad de pensar en locale

Como lo sugirió Michael

Utilice esta variante: SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

select getdate()

SELECT DATEADD(hh, DATEDIFF(hh, 0, getdate()), 0)
SELECT DATEADD(hh, 0, DATEDIFF(hh, 0, getdate()))

SELECT DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))

SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
SELECT DATEADD(mm, 0, DATEDIFF(mm, 0, getdate()))

SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
SELECT DATEADD(yy, 0, DATEDIFF(yy, 0, getdate()))

Salida:

2019-04-19 08:09:35.557

2019-04-19 08:00:00.000
4763-02-17 00:00:00.000

2019-04-19 00:00:00.000
2019-04-19 00:00:00.000

2019-04-01 00:00:00.000
1903-12-03 00:00:00.000

2019-01-01 00:00:00.000
1900-04-30 00:00:00.000

respondido 07 nov., 19:15

+1 Parece que este es un 35% más rápido que el método double convert () de uso común (que también he usado durante años). Bonita. - danés

El único inconveniente que puedo ver de su solución es que, a menos que sepa lo que está haciendo, es un poco obtuso. El uso del método de doble conversión hace que sus intenciones sean más obvias para los futuros mantenedores de código. Por cierto, no te he votado en contra. Creo que también empezaré a usar tu método. Gracias @aku - Jim Birchall

@pilavdzice Establecer una fecha y hora a la medianoche de ese día DEJAR EL TIEMPO. ¿Qué resultado esperas? La datetime el tipo de datos no puede tener no hay tiempo en absoluto. Creo que está confundiendo el almacenamiento de datos con la presentación del usuario. Si todo lo que desea es una forma de mostrarle a un usuario una cadena que no tiene una porción de tiempo (ni ceros, solo espacios en blanco), simplemente Convert(varchar(30), @Date, 101) o algo similar. Ver Libros en pantalla de SQL Server • Transmitir y convertir para más información. - ErikE

@ user1671639 el tipo de datos de fecha y hora siempre contiene una fecha y una hora, no puede almacenar una sin la otra de manera sensata, a menos que esté utilizando SQL Server 2008, en cuyo caso también hay datos de 'fecha' y 'hora' separados tipos. Si usa CONVERT () de esa manera, realmente quiere una cadena para uso posterior, por lo que se quedará atascado al hacerlo así, aunque sería mejor si usara funciones de formato de fecha en lugar de cortar la fecha, o mediante CAST(... AS DATE) or CONVERT(DATE, ...), que se ha mencionado con bastante frecuencia en esta misma página. - Magnus

Recomiendo cambiar la respuesta a SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0) porque entonces dd se puede cambiar por cualquier otro datepart palabra clave para truncar su datetime a un nivel arbitrario. - Michael

SQLServer 2008 ahora tiene un tipo de datos de 'fecha' que contiene solo una fecha sin componente de hora. Cualquiera que utilice SQLServer 2008 y más allá puede hacer lo siguiente:

SELECT CONVERT(date, GETDATE())

Respondido 18 Abr '16, 16:04

También existe el tipo de datos 'tiempo' en SQL2008 que responde a la otra mitad de la cuestión de separar la fecha y la hora. - misteridan

Para su información, comparé diferentes métodos para recortar el tiempo de las fechas y este fue el método más rápido. Es cierto que la diferencia fue pequeña, pero fue claramente más rápida en un gran número de ejecuciones. - Sin manejarExcepSean

¿Qué pasa con sqlserver 2005? - Dra. MAF

@ Dr.MAF Completando el círculo, la respuesta anterior a 2008 está aquí: stackoverflow.com/questions/113045/… - Frosty840

Si usa SQL 2008 y superior:

select cast(getdate() as date)

respondido 30 mar '16, 00:03

@FredrickGauss: ¿Qué tipo, fecha? ¿Qué versión de SQL Server usas? - abatishchev

¡Tener cuidado! declare @ date1 datetime = '2015-09-30 20: 59: 59.999'; select cast (@ date1 as date) devuelve '2015-10-01' - Nick

@Nick: este es el problema con DateTime. usar DateTime2 en su lugar, funciona bien. sqlfiddle.com/#!6/9eecb7/2833 - abatishchev

@Nick, para complementar la respuesta de abatishchev, su @ date1 es de hecho 2015-10-01, Debido a DateTime limitaciones. Intente sin ningún yeso Date, cede 2015-10-01¡Precioso! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1 => 2015-10-01 - Frédéric

Uno de estos trucos SQL fáciles de recordar. Como dice Mike, solo desde 2008 en adelante, pero, si encuentra una base de datos de 2005 y anterior en alguna parte, es posible que tenga muchos problemas :) - NicVerAZ

DATEADD y DATEDIFF son mejores que CONVERTing a varchar. Ambas consultas tienen el mismo plan de ejecución, pero los planes de ejecución son principalmente sobre datos estrategias de acceso y no siempre revelan los costos implícitos involucrados en el tiempo de la CPU para realizar todas las piezas. Si ambas consultas se ejecutan en una tabla con millones de filas, el tiempo de CPU usando DateDiff puede ser cercano a 1/3 del tiempo de conversión de CPU.

Para ver los planes de ejecución de las consultas:

set showplan_text on
GO 

Tanto DATEADD como DATEDIFF ejecutarán un CONVERT_IMPLICIT.

Aunque la solución CONVERT es más simple y más fácil de leer para algunos, is Más lento. No hay necesidad de volver a la fecha y hora (esto lo hace implícitamente el servidor). Tampoco hay una necesidad real en el método DateDiff para DateAdd posteriormente, ya que el resultado entero también se convertirá implícitamente a datetime.


SELECCIONE CONVERT (varchar, MyDate, 101) FROM DatesTable

  |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
       |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))

SELECT DATEADD (dd, 0, DATEDIFF (dd, 0, MyDate)) FROM 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]))

El uso de FLOOR () como sugirió @digi tiene un rendimiento más cercano a DateDiff, pero no se recomienda ya que convertir el tipo de datos de fecha y hora para flotar y retroceder no siempre produce el valor original.

Recuerden chicos: no le crean a nadie. ¡Mire las estadísticas de rendimiento y pruébelo usted mismo!

Tenga cuidado cuando esté probando sus resultados. Seleccionar muchas filas para el cliente ocultará la diferencia de rendimiento porque lleva más tiempo enviar las filas a través de la red que realizar los cálculos. Por lo tanto, asegúrese de que el servidor realice el trabajo de todas las filas, pero no se envíe ningún conjunto de filas al cliente.

Parece haber confusión para algunas personas acerca de cuándo la optimización de la caché afecta las consultas. La ejecución de dos consultas en el mismo lote o en lotes separados no tiene ningún efecto sobre el almacenamiento en caché. Por lo tanto, puede caducar el caché manualmente o simplemente ejecutar las consultas varias veces. Cualquier optimización para la consulta n. ° 2 también afectaría a las consultas posteriores, así que descarte la ejecución n. ° 1 si lo desea.

Esta es guión de prueba completo y resultados de rendimiento que demuestran que DateDiff es sustancialmente más rápido que convertir a varchar.

contestado el 23 de mayo de 17 a las 13:05

Ricardo C, ¡linda investigación! ¿Qué versión de servidor SQL utiliza? En el método MSSQL2000 con dateiff funciona un poco más rápido para mí. - aku

Solo para tener en cuenta, realicé la prueba 1000.000 veces. Para escenarios del mundo real, la diferencia de rendimiento no será notable, supongo: aku

Aku, utilicé SQL Server 2005 Express para esta prueba. Trabajo en 2000 en el trabajo, y lo probaré con una tabla con más de 24 millones de filas y veré qué sale de ella. - ricardo c

Aku, los mismos resultados. No hay diferencia de rendimiento en diez millones de filas. - ricardo c

Las afirmaciones sobre la igualdad de rendimiento no son ciertas. Por supuesto que los planes de ejecución serán los mismos !!! La medición del rendimiento en estos DEBE realizarse comparando el uso de la CPU, no examinando los planes de ejecución. - ErikE

Prueba esto:

SELECT CONVERT(VARCHAR(10),GETDATE(),111)

La declaración anterior convierte su formato actual a YYYY/MM/DD, por favor refiérase a este enlace para elegir su formato preferido.

Respondido el 14 de Septiembre de 18 a las 12:09

Esto devuelve '2008/09/22' para mí - Eddiegroves

SELECT CONVERT (VARCHAR (10), GETDATE (), 101) es mm/dd/yyyy formato. - Pulga

si está ordenando según el valor del texto sin formato (fuera de la base de datos), entonces el formato 'japonés' es mejor: simon_weaver

SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))

Respondido el 31 de enero de 11 a las 09:01

Para devolución en formato de fecha

CAST (OrderDate AS fecha)

El código anterior funcionará en SQL Server 2010

Regresará como el 12/12/2013

Para SQL Server 2012 use el siguiente código

CONVERT(VARCHAR(10), OrderDate , 111)

Respondido 27 ago 14, 09:08

Esto me devuelve la fecha con la hora cero, no solo la fecha. Bohemio ♦

¿Puedo saber qué versión si el servidor SQL está utilizando? - Mahesh ML

@MaheshML devuelve la fecha y la hora en MS SQL 2012. - Marek

Funciona como un encanto en SQL Azure - Martín Coll

@MaheshML No existe SQL Server 2010. - SvenAelterman

Puede utilizar el CONVERT función para devolver solo la fecha. Vea los enlaces a continuación:

Manipulación de fecha y hora en SQL Server 2000

CAST y CONVERT

La sintaxis para usar la función de conversión es:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 

Respondido 14 Abr '15, 12:04

Si necesita el resultado como varchar, deberías pasar por

SELECT CONVERT(DATE, GETDATE()) --2014-03-26
SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26

que ya se mencionó anteriormente.

Si necesita un resultado en formato de fecha y hora, debe utilizar cualquiera de las consultas siguientes

  1. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate 
    

    2014-03-26 00:00:00.000

  2. SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate 
    

    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

respondido 07 nov., 19:15

Si está utilizando SQL Server 2012 o versiones posteriores,

Utilice la herramienta Format() función.

Ya existen múltiples respuestas y tipos de formato para el servidor SQL. Pero la mayoría de los métodos son algo ambiguos y le resultaría difícil recordar los números para el tipo de formato o las funciones con respecto al formato de fecha específico. Es por eso que en las próximas versiones del servidor SQL existe una mejor opción.

FORMAT ( value, format [, culture ] )

La opción de cultura es muy útil, ya que puede especificar la fecha según sus espectadores.

Debe recordar d (para patrones pequeños) y D (para patrones largos).

1. "d": patrón de fecha corto.

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": patrón de fecha larga.

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)

Más ejemplos en 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日

Si desea más formatos, puede ir a:

  1. Cadenas de formato de fecha y hora estándar
  2. Cadenas de formato de fecha y hora personalizadas

Respondido el 20 de Septiembre de 16 a las 06:09

Para omitir la cultura, los formatos personalizados le permiten configurar los suyos, por ejemplo FORMAT (@d, 'yyyyy-MM-dd') para obtener 2011-10-11. - Ourmandave

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

Respondido el 27 de enero de 17 a las 21:01

Usando FLOOR () - simplemente corte la parte de tiempo.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)

Respondido el 22 de Septiembre de 08 a las 08:09

Este método no es el más rápido, y también enseña implícitamente a las personas que lanzar fechas para flotar es preciso, lo cual no es cierto. Por favor mira esta publicación para más detalles. - ErikE

SI desea utilizar CONVERT y obtener el mismo resultado que en la pregunta original planteada, es decir, aaaa-mm-dd, utilice CONVERT(varchar(10),[SourceDate as dateTime],121) El mismo código que el par anterior responde, pero el código para convertir a aaaa-mm-dd con guiones es 121.

Si puedo entrar en mi tribuna por un segundo, este tipo de formato no pertenece al nivel de datos, y es por eso que no fue posible sin 'trucos' tontos de alta sobrecarga hasta SQL Server 2008, cuando se introducen los tipos de datos de fecha real. Hacer tales conversiones en el nivel de datos es una gran pérdida de sobrecarga en su DBMS, pero lo más importante es que en el segundo que hace algo como esto, básicamente ha creado datos huérfanos en la memoria que supongo que luego volverá a un programa. No puede volver a colocarlo en otra columna 3NF + o compararlo con cualquier cosa escrita sin revertir, por lo que todo lo que ha hecho es introducir puntos de falla y eliminar la referencia relacional.

SIEMPRE debe continuar y devolver su tipo de datos dateTime al programa de llamada y en el nivel PRESENTACIÓN, realice los ajustes necesarios. Tan pronto como vaya a convertir cosas antes de devolvérselas a la persona que llama, está eliminando toda esperanza de integridad referencial de la aplicación. Esto evitaría una operación ACTUALIZAR o ELIMINAR, nuevamente, a menos que realice algún tipo de reversión manual, que nuevamente expondrá sus datos a un error humano / código / gremlin cuando no es necesario.

Respondido 26 Jul 12, 21:07

Excepto, digamos, si quieres un pregunta que recupera todos los registros que coinciden con un proporcionado por el usuario datos como la parte de fecha de un campo de tiempo determinado. Buena suerte haciendo eso solo en la capa de presentación. (No necesita convertir, puede usar aritmética de fechas, pero se hace una idea…) - Andrés Lázaro

@Andrew, ¿por qué importa eso? Tu dices WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date); - No hay absolutamente ninguna razón para quitarle tiempo a la columna. - Aarón Bertrand

@AaronBertrand Eso solo funciona asumiendo la entrada @Date tiene una parte de tiempo cero. En caso de que eso no sea cierto, aún necesita saber cómo truncar los tiempos del lado del servidor. Estoy de acuerdo con esta respuesta de que el formato debe dejarse en la capa de presentación, pero no estoy de acuerdo con la implicación de que dejar eso para el front-end significa que no tiene que conocer una forma rápida de truncar. - Andrés Lázaro

@Andrew, todo lo que tienes que hacer es hacer que el parámetro de entrada sea FECHA. Mi punto es que nunca debería tener que aplicar tal truncamiento a la visión de conjunto, aunque ese es el primer instinto de la mayoría de la gente. - Aarón Bertrand

@AaronBertrand y esta asume que tiene control sobre el tipo de datos del parámetro. Bien en un procedimiento almacenado, no tan posible en otras situaciones. ¿Por qué no emitir para asegurarse de que el parámetro sea del tipo que desea y necesita? - Andrés Lázaro

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: Los dos primeros métodos son esencialmente los mismos y superan el método de conversión a varchar.

respondido 29 mar '16, 23:03

Todos estos métodos son geniales, pero ¿cuál sugiere usar? - Eddiegroves

Tenga en cuenta que la versión "correcta" de los dos primeros es select dateadd(dd, datediff(dd, 0, getdate()), 0), Debido a que el dds pueden intercambiarse por cualquiera de datepart las palabras claves para recortar la fecha en cualquier segmento que elija. (También tenga en cuenta que dd es solo una abreviatura de day.) - Michael

Para obtener el resultado indicado, utilizo el siguiente comando.

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

Creo que es útil.

respondido 29 mar '16, 23:03

 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

 Convert(nvarchar(12), getdate(), 101) --->  5/12/2014

Respondido el 06 de junio de 15 a las 13:06

Si asigna los resultados a una columna o variable, asígnele el tipo FECHA y la conversión será implícita.

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03

contestado el 03 de mayo de 17 a las 17:05

Creo que esto funcionaría en tu caso:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25

respondido 27 nov., 13:06

DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)

respondido 30 mar '16, 01:03

Esta sugerencia ha sido cubierta por otras respuestas (más de una vez). - andriy m

Bien, aunque llego un poco tarde :), aquí está la otra solución.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)

Resultado

2008-09-22 00:00:00.000

Y si está utilizando SQL Server 2012 y superior, puede utilizar FORMAT() funciona así -

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')

Respondido 13 Abr '16, 11:04

Su primer ejemplo todavía tiene un componente de tiempo. El punto de la pregunta era cómo eliminar eso. - Zack

Fecha:

SELECT CONVERT (fecha, GETDATE ()) SELECT CAST (GETDATE () como fecha)

Hora:

SELECT CONVERT (hora, GETDATE (), 114) SELECT CAST (GETDATE () como hora)

contestado el 21 de mayo de 16 a las 10:05

En este caso, solo la fecha, vamos a ejecutar esta consulta:

SELECCIONAR CONVERTIR (VARCHAR (10), getdate (), 111);enter image description here

respondido 24 nov., 19:08

Incluso usando el antiguo MSSQL Server 7.0, el código aquí (cortesía de este aquí) me permitió obtener el formato de fecha que estaba buscando en ese momento:

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)

Produjo esta salida:

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

Respondido 27 Feb 15, 21:02

Simplemente puedes hacerlo de esta manera:

SELECT CONVERT(date, getdate())
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Salidas como:

2008-09-22 00:00:00.000

O simplemente hazlo así:

SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'

Resultado:

Date Part Only
--------------
2013-07-14

Respondido el 08 de Septiembre de 17 a las 10:09

Solo haz:

SELECT CAST(date_variable AS date)

o con PostgreSQL:

SELECT date_variable::date

Respondido el 22 de enero de 20 a las 16:01

¿Por qué no usas DATE_FORMAT (your_datetiem_column, '% d-% m-% Y')?

EX: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

puede cambiar la secuencia de m, dy año reorganizando '%d-%m-%Y' parte

contestado el 17 de mayo de 14 a las 06:05

Sé que esto es antiguo, pero no veo dónde alguien lo dijo de esta manera. Por lo que puedo decir, este es el estándar ANSI.

SELECT CAST(CURRENT_TIMESTAMP AS DATE)

Sería bueno si Microsoft también pudiera admitir la variable CURRENT_DATE del estándar ANSI.

Respondido el 15 de enero de 16 a las 18:01

select {fn current_date()} as today funciona para mi. - Brianary

@brianary - Eso es bueno, pero no es ANSI SQL. - lit

Eso es bastante justo, y su respuesta es muy portátil, pero pensé que mientras estemos trabajando en T-SQL, esto también funciona (y muestra que implementar ANSI CURRENT_DATE sería trivial para MS). - Brianary

Estoy a favor de lo siguiente que no se mencionó:

DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))

Tampoco le importa lo local o hacer una doble conversión, aunque cada 'datepart' probablemente hace matemáticas. Por lo tanto, puede ser un poco más lento que el método de dateiff, pero para mí es mucho más claro. Especialmente cuando quiero agrupar solo por año y mes (establezca el día en 1).

respondido 29 mar '16, 23:03

A partir de SQL SERVER 2012, puede hacer esto:

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

Respondido 20 Jul 16, 16:07

En SQL Server 2000

CAST(
(
    STR( YEAR( GETDATE() ) ) + '/' +
    STR( MONTH( GETDATE() ) ) + '/' +
    STR( DAY( GETDATE() ) )
)
AS DATETIME)

Respondido el 21 de junio de 17 a las 07:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.