Pregunta 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 fecha sin la parte de tiempo: 2008-09-22 00:00:00.000

¿Cómo puedo obtener eso?


1404
2017-09-22 03:31


origen


Respuestas:


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

Pros:

  • No varchar<->datetime conversiones requeridas
  • No es necesario pensar locale

2056
2017-09-22 03:34



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

SELECT CONVERT(date, GETDATE())

657
2017-09-24 13:02



Si usa SQL 2008 y superior:

select cast(getdate() as date)

141
2018-01-31 09:44



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 primordialmente datos estrategias de acceso y no siempre revelan los costos implícitos involucrados en el tiempo de CPU utilizado para realizar todas las piezas. Si ambas consultas se ejecutan contra una tabla con millones de filas, ¡el tiempo de CPU que utiliza DateDiff puede ser cercano a 1/3 del tiempo de CPU de conversión!

Para ver planes de ejecución para 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 fácil de leer para algunos, es más lento. No es necesario volver al datetime (esto lo hace implícitamente el servidor). Tampoco hay una necesidad real en el método DateDiff para DateAdd después ya que el resultado entero también se convertirá implícitamente a datetime.


SELECCIONAR CONVERTIR (varchar, MyDate, 101) FROM DatesTable

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

SELECCIONAR 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 @digi sugirió que tiene un rendimiento más cercano a DateDiff, pero no se recomienda que el tipo de datos de fecha y hora para flotar y volver no siempre arroje el valor original.

Recuerde chicos: no le crean a nadie. ¡Mira las estadísticas de rendimiento y pruébalo tú mismo!

Tenga cuidado cuando prueba sus resultados. Al seleccionar muchas filas para el cliente, se ocultará la diferencia de rendimiento, ya que lleva más tiempo enviar las filas a través de la red que para realizar los cálculos. Por lo tanto, asegúrese de que el trabajo para todas las filas sea realizado por el servidor pero no haya ningún conjunto de filas enviado al cliente.

Parece que hay confusión para algunas personas acerca de cuándo la optimización de caché afecta las consultas. Ejecutar dos consultas en el mismo lote o en lotes separados no tiene ningún efecto en 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 cualquier consulta subsiguiente, por lo que descarta la ejecución n. ° 1 si lo desea.

Aquí está script de prueba completo y resultados de rendimiento que prueban que DateDiff es sustancialmente más rápido que convertir a varchar.


67
2017-09-22 03:33



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

41
2017-09-22 03:33



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

35
2017-09-22 03:34



Puedes usar el CONVERT función para devolver solo la fecha. Ver los enlaces a continuación:

Manipulación de fecha y hora en SQL Server 2000

CAST y CONVERTIR

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

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

18
2017-12-19 06:48



Para el formato de devolución de fecha 

CAST (Fecha OrderDate AS)

El código anterior funcionará en el servidor sql 2010

Volverá como 12/12/2013

Para SQL Server 2012 usa el siguiente código

CONVERT(VARCHAR(10), OrderDate , 111)

17
2017-09-22 07:38



Usando FLOOR () - solo corte la parte del tiempo.

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

12
2017-09-22 12:21