Pregunta

SELECT GETDATE()

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

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

¿Cómo puedo conseguir eso?

¿Fue útil?

Solución

En 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

Ventajas:

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

Como lo sugiere Miguel

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

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()))

Producción:

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

Otros consejos

SQLServer 2008 ahora tiene un tipo de datos 'fecha' que contiene sólo una fecha sin componente de hora.Cualquiera que utilice SQLServer 2008 y versiones posteriores puede hacer lo siguiente:

SELECT CONVERT(date, GETDATE())

Si utiliza SQL 2008 y superior:

select cast(getdate() as date)

DATEADD y DATEDIFF son mejores que CONVERTIR a varchar.Ambas consultas tienen el mismo plan de ejecución, pero los planes de ejecución se refieren principalmente a datos estrategias de acceso y no siempre revelan costos implícitos involucrados en el tiempo de CPU necesario 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 planes de ejecución de consultas:

set showplan_text on
GO 

Tanto DATEADD como DATEDIFF ejecutarán un CONVERT_IMPLICIT.

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


SELECCIONE CONVERTIR (varchar, MyDate, 101) FROM DatesTable

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

SELECCIONE DATEADD(dd, 0, DATEDIFF(dd, 0, MyDate)) DE 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 a flotante y viceversa no siempre produce el valor original.

Recuerden chicos:No le creas 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 que no se envíe ningún conjunto de filas al cliente.

Algunas personas parecen tener confusión 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 hacer caducar el caché manualmente o simplemente ejecutar las consultas varias veces.Cualquier optimización para la consulta n.° 2 también afectaría las consultas posteriores, así que descarte la ejecución n.° 1 si lo desea.

Aquí está script de prueba completo y resultados de rendimiento eso demuestra que DateDiff es sustancialmente más rápido que la conversión a varchar.

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.

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

Puedes usar 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

TRANSMITIR y CONVERTIR

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

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

Para devolución en formato de fecha

CAST (fecha del pedido como fecha)

El código anterior funcionará en SQL Server 2010.

Volverá como el 12/12/2013

Para SQL Server 2012 utilice el siguiente código

CONVERT(VARCHAR(10), OrderDate , 111)
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

Usando FLOOR() - simplemente reduzca la parte del tiempo.

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

Si estas usando SQL Server 2012 o versiones superiores,

Usar Format() función.

Ya existen varias 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 del 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 hay una mejor opción.

FORMAT ( value, format [, culture ] )

La opción Cultura es muy útil, ya que puedes especificar la fecha según tus espectadores.

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

1."d" - Patrón de fecha corta.

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 quieres más formatos, puedes ir a:

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

SI desea utilizar CONVERTIR 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 las respuestas del par anterior, pero el código para convertir a yyyy-mm-dd con guiones es 121.

Si puedo subir a 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 y costosos hasta SQL Server 2008, cuando se introdujeron los tipos de datos reales de parte de fecha.Realizar tales conversiones en el nivel de datos es una gran pérdida de gastos generales en su DBMS, pero lo más importante es que en el momento en que hace algo como esto, básicamente habrá creado datos huérfanos en memoria que supongo que luego regresará a un programa.No puede volver a colocarlo en otra columna 3NF+ ni compararlo con nada escrito sin revertirlo, 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 convierte cosas antes de devolvérselas a la persona que llama, elimina 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, lo que nuevamente expone sus datos a errores humanos/código/gremlin cuando no es necesario.

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 al método de conversión a varchar.

Para obtener el resultado indicado utilizo el siguiente comando.

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

Espero que sea útil.

Si necesita un resultado en el tipo de datos varchar, debe seguir

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

que ya se mencionó anteriormente

Si necesita resultados en formato de fecha y hora, debe realizar cualquiera de las siguientes consultas

1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) como OnlyDate --2014-03-26 00:00:00.000

2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) como 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

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

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

Si está asignando 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

Creo que esto funcionaría en tu caso:

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

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() funcionar así -

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

Incluso usando el antiguo MSSQL Server 7.0, el código aquí (cortesía de este enlace) me permitió obtener cualquier 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 este resultado:

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)

Fecha:

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

Tiempo:

SELECT CONVERT(time , GETDATE() , 114)
SELECT CAST(GETDATE() as time)

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

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

Tampoco le importa el local ni realizar una doble conversión, aunque cada 'parte de fecha' probablemente haga cálculos.Puede que sea un poco más lento que el método 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).

A partir de SQL SERVER 2012, puede hacer esto:

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

En SQL Server 2000

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

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

¿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,d y año reorganizando '%d-%m-%Y' parte

Sé que esto es antiguo, pero no veo dónde alguien lo haya dicho 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.

Esto faltaba en todas las respuestas, puede que no sea el más eficiente, pero es muy fácil de escribir y comprender, no se necesita estilo ni funciones de fecha complejas.

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

Puede utilizar lo siguiente para la parte de la fecha y formatear la fecha:

DATENAME => Devuelve una cadena de caracteres que representa la parte de fecha especificada de la fecha especificada

FECHAADD => El DATEPART() La función se utiliza para devolver una sola parte de una fecha/hora, como año, mes, día, hora, minuto, etc.

DATEPART =>Devuelve un número entero que representa la parte de fecha especificada de la fecha especificada.

CONVERT() = > El CONVERT() La función es una función general que convierte una expresión de un tipo de datos en otro.ElCONVERT() La función se puede utilizar para mostrar datos de fecha/hora en diferentes formatos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top