it-swarm-es.tech

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 conseguir eso?

1544
eddiegroves

En SQL Server 2008 y superior, debe CONVERT hasta la fecha:

SELECT CONVERT(date, getdate())

En versiones anteriores, puedes 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 se requieren varchar <-> datetime conversiones
  • No hay necesidad de pensar en locale
2234
aku

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

SELECT CONVERT(date, GETDATE())
679
BenR

Si usa SQL 2008 y superior:

select cast(getdate() as date)
154
abatishchev

DATEADD y DATEDIFF son mejores que CONVERTIR 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 CPU necesario para realizar todas las piezas. Si ambas consultas se ejecutan en una tabla con millones de filas, ¡el tiempo de CPU que usa DateDiff puede estar cerca de 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.

Si bien la solución CONVERT es más simple y fácil de leer para algunos, es es más lento. No es necesario volver a 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 de nuevo 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ó tiene un rendimiento más cercano al de DateDiff, pero no se recomienda, ya que convertir el tipo de datos datetime en float y back no siempre produce el valor original.

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

Ten cuidado cuando estés probando tus resultados. La selección de muchas filas al cliente ocultará la diferencia de rendimiento, ya que demora más en enviar las filas a través de la red que en realizar los cálculos. Así que asegúrese de que el servidor realice el trabajo de todas las filas, pero no se envía ningún conjunto de filas al cliente.

Parece que hay confusión para algunas personas acerca de cuándo la optimización de caché afecta a las consultas. La ejecución de dos consultas en el mismo lote o en lotes separados no tiene ningún efecto en el almacenamiento en caché. Por lo tanto, puede expirar el caché manualmente o simplemente ejecutar las consultas de un lado a otro varias veces. Cualquier optimización para la consulta # 2 también afectaría cualquier consulta posterior, así que deseche la ejecución # 1 si lo desea.

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

70
Ricardo C

Prueba esto:

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

La declaración anterior convierte su formato actual a YYYY/MM/DD, consulte este enlace para elegir su formato preferible.

41
Nescio
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
37
Cade Roux

Puede usar la función CONVERT para devolver solo la fecha. Vea el enlace (s) 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 ] ) 
19
DaveK

Para la devolución en formato de fecha  

CAST (Fecha de pedido)

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

Volverá como 12/12/2013

Para SQL Server 2012 use el siguiente código

CONVERT(VARCHAR(10), OrderDate , 111)
17
Mahesh ML

Usando FLOOR () - simplemente cortar parte del tiempo.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
13
DiGi
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
Rushda

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

Si puedo acceder a mi caja de jabón por un segundo, este tipo de formato no pertenece al nivel de datos , y es por eso que no fue posible sin los "trucos" de alta sobrecarga. hasta SQL Server 2008 cuando se introducen los tipos de datos de la fecha real. 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 segundo que haga 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 + ni compararlo con nada escrito sin revertir, por lo que todo lo que ha hecho es introducir puntos de falla y eliminar la referencia relacional. 

SIEMPRE debe seguir adelante y devolver su tipo de datos dateTime al programa de llamada y en el nivel PRESENTACIÓN, hacer los ajustes necesarios. Tan pronto como vaya convirtiendo las cosas antes de devolverlas a la persona que llama, está eliminando toda esperanza de integridad referencial de la aplicación. Esto evitaría una operación ACTUALIZAR o BORRAR, nuevamente, a menos que haga algún tipo de reversión manual, lo que nuevamente está exponiendo sus datos a un error humano/código/gremlin cuando no hay necesidad.

11
Focusyn

Si está utilizando SQL Server 2012 o versiones anteriores ,

Utilice Format() function.

Ya hay múltiples respuestas y tipos de formato para el servidor SQL. Pero la mayoría de los métodos son algo ambiguos y sería difícil para usted 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 hay 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 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
10
Somnath Muluk
SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)

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

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))

Edición: los dos primeros métodos son esencialmente los mismos y realizan el método de conversión a varchar.

10
Gordon Bell

Para obtener el resultado indicado, uso el siguiente comando.

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

Yo holpe es útil.

9
Anderson Silva

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

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

que ya se ha mencionado anteriormente 

Si necesita resultados en formato de fecha y hora, debe pasar por 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

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

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

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
7
Art Schmidt

Bueno, 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 usar la función FORMAT() de esta manera:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
6
Krishnraj Rana

Creo que esto funcionaría en tu caso:

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

Incluso utilizando el antiguo MSSQL Server 7.0, el código aquí (cortesía de este enlace ) 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)

Se 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
5
Matt O'Brien
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
5
etni

A partir de SQL SERVER 2012, puedes hacer esto:

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

4
xbb

Estoy a favor de lo siguiente que no fue mencionado:

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

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

4
Gerard ONeill

En SQL Server 2000

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

Fecha:

 SELECCIONAR CONVERTIR (fecha, GETDATE ()) 
 SELECT CAST (GETDATE () como fecha) 

Hora:

 SELECCIONAR CONVERTIR (hora, GETDATE (), 114) 
 SELECT CAST (GETDATE () como hora) 
4
Kris Khairallah

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 haz esto:

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

Resultado:

Date Part Only
--------------
2013-07-14
3
Amar Srivastava

¿por qué no usa DATE_FORMAT (su_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 la parte '%d-%m-%Y'

3

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

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

Fecha (campo de fecha y hora) y DATE_FORMAT (fecha y hora, '% Y-% m-% d') ambas devoluciones solo fecha desde fecha y hora 

2
Surekha
SELECT * FROM tablename WHERE CAST ([my_date_time_var] AS DATE)= '8/5/2015'
2
Binitta Mary

Puede usar lo siguiente para la parte de la fecha y el formato de la fecha:

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

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

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

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

2
user1151326

Sé que esto es viejo, 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 estándar ANSI CURRENT_DATE.

2
lit

Si usa SQL 2008 y superior: SELECT CONVERT(DATE ,GETDATE())

1
Morteza Sefidi

Prueba esto:

SELECT CONVERT(date, GETDATE()) as date
1
Rafiqul Islam

Mi enfoque común para obtener la fecha sin la parte de tiempo .. 

 SELECT CONVERT(VARCHAR(MAX),GETDATE(),103)

 SELECT CAST(GETDATE() AS DATE)
1
Spider

seleccione convertir (getdate () como daselect CONVERT (datetime, CONVERT (date, getdate ()))

0
mokh223

puede usarlo a continuación para diferentes tipos de salida solo para la fecha

  1. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 103)) ----- dd/mm/aaaa

  2. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))------ mm/dd/aaaa

  3. SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 102))

0
ankit soni
select cast(createddate as date) as derivedate from table 

createdate es su columna de fecha y hora, esto funciona para sqlserver

0
karthik kasubha

SELECCIONAR CONVERTIR (fecha, fecha de vencimiento ())

0
Shiraj Momin

Simplemente puede usar el siguiente código para obtener solo la parte de la fecha y evitar la parte de la hora en SQL:

SELECT SYSDATE TODAY FROM DUAL; 
0
Shyam Bhimani

La forma más fácil sería utilizar: SELECT DATE(GETDATE())

0
Jithin Joy

Wow, déjame contar las formas en que puedes hacer esto. (sin juego de palabras)

Para obtener los resultados que desea en este formato específicamente:

2008-09-22

Aquí hay algunas opciones.

SELECT CAST(GETDATE() AS DATE) AS 'Date1'
SELECT Date2  = CONVERT(DATE, GETDATE())
SELECT CONVERT(DATE, GETDATE()) AS 'Date3'
SELECT CONVERT(CHAR(10), GETDATE(), 121) AS 'Date4'
SELECT CONVERT(CHAR(10), GETDATE(), 126) AS 'Date5'
SELECT CONVERT(CHAR(10), GETDATE(), 127) AS 'Date6'

Por lo tanto, sugeriría elegir uno con el que se sienta cómodo y usar ese método en todas las mesas.

Todas estas opciones devuelven la fecha en el mismo formato exacto. ¿Por qué SQL Server tiene tanta redundancia?

No tengo idea, pero la tienen. Tal vez alguien más listo que yo pueda responder esa pregunta.

Espero que esto ayude a alguien.

0
Aubrey Love

Mi estilo

      select Convert(smalldatetime,Convert(int,Convert(float,getdate())))
0
CAGDAS AYDIN