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

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

Eddiegroves
fuente
44
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.
Quintin Robinson el
16
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 información aquí: sql-server-performance.com/articles/dev/datetime_2008_p1.aspx
Ben Hoffstein
77
No se pierda esta publicación que muestra los resultados de las pruebas de rendimiento de los diversos métodos de eliminación de tiempo.
ErikE
18
No se deje engañar por los votos y la respuesta aceptada, eche un vistazo a stackoverflow.com/a/126984/1155650
Rohit Vipin Mathews
8
@Rohit Asume 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.
hktegner

Respuestas:

2487

En SQL Server 2008adelante, debes CONVERTfechar:

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 se requieren varchar<-> datetimeconversiones
  • No hay necesidad de pensar locale

Según lo sugerido por Michael

Usa 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
aku
fuente
52
+1 Parece que este es un 35% más rápido que el método de doble conversión () comúnmente utilizado (que también he usado durante años). Buena esa.
Dane
8
El único inconveniente que puedo ver en 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 mantenedores de código futuros. Por cierto, no te he rechazado. Creo que también comenzaré a usar tu método. Gracias @aku
Jim Birchall
38
@pilavdzice Establecer una fecha y hora a la medianoche de ese día DEJA LA HORA ¿Qué resultado esperas? El datetimetipo de datos no puede tener tiempo en absoluto . Creo que está confundiendo el almacenamiento de datos con la presentación del usuario. Si todo lo que quiere es una forma de mostrarle a un usuario una cadena que no tiene una porción de tiempo (no ceros, solo espacios en blanco), entonces simplemente quiere Convert(varchar(30), @Date, 101)o algo similar. Consulte los Libros en pantalla de SQL Server • Transmitir y convertir para obtener más información.
ErikE
77
@ user1671639 el tipo de datos de fecha y hora siempre contiene una fecha y una hora, no se puede almacenar una sin la otra, a menos que esté utilizando SQL Server 2008, en cuyo caso también hay datos separados de 'fecha' y 'hora' tipos. Si usa CONVERT () así, realmente desea una cadena para su uso posterior, por lo que se quedará atrapado haciéndolo así, aunque sería mejor si usara funciones de formato de fecha en lugar de cortar la fecha, o mediante CAST(... AS DATE)o CONVERT(DATE, ...), que se ha mencionado con bastante frecuencia en esta misma página.
Magnus
10
Recomiendo cambiar la respuesta a SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)porque luego se ddpuede cambiar por cualquier otra datepartpalabra clave para truncar su datetimenivel arbitrario.
Michael - ¿Dónde está Clay Shirky?
717

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())
BenR
fuente
41
También existe el tipo de datos 'hora' en SQL2008 que responde a la otra mitad de la pregunta de separar la fecha y la hora.
misteraidan
8
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. De acuerdo, la diferencia fue pequeña, pero fue claramente más rápida en un gran número de ejecuciones.
UnhandledExcepSean
2
¿Qué pasa con sqlserver 2005?
Dr. MAF
@ Dr.MAF Completando el círculo, la respuesta anterior a 2008 está aquí: stackoverflow.com/questions/113045/…
Frosty840
170

Si usa SQL 2008 y superior:

select cast(getdate() as date)
abatishchev
fuente
3
@FredrickGauss: ¿Qué tipo, Fecha? ¿Qué versión de SQL Server usas?
abatishchev
77
¡Tener cuidado! declare @ date1 datetime = '2015-09-30 20: 59: 59.999'; select cast (@ date1 as date) devuelve '2015-10-01'
Nick
66
@ Nick: este es el problema con DateTime. utilizar DateTime2en su lugar y funciona bien. sqlfiddle.com/#!6/9eecb7/2833
abatishchev
8
@Nick, para complementar la respuesta abatishchev, su @ date1 se 2015-10-01debe a DateTimelimitaciones. Pruébalo sin ningún yeso Date, ¡también cede 2015-10-01! declare @date1 datetime = '2015-09-30 23:59:59.999';select @date1=>2015-10-01
Frédéric
44
Uno de estos trucos SQL fáciles de recordar. Como dice Mike, solo 2008 en adelante, pero, si encuentra un DB 2005 y anterior en algún lugar, puede tener muchos problemas :)
NicVerAZ
73

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

Para ver los 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 simple y fácil de leer para algunos, es más lenta. No es necesario 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 después, ya que el resultado entero también se convertirá implícitamente a datetime.


CONVERTIR SELECCIONAR (varchar, MyDate, 101) DESDE 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 @digi sugirió tiene un rendimiento más cercano a DateDiff, pero no se recomienda ya que transmitir el tipo de datos datetime a flotante y viceversa no siempre produce el valor original.

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

Tenga cuidado cuando esté probando sus resultados. Al seleccionar muchas filas para el cliente, se 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 trabajo para todas las filas lo realiza el servidor, pero no se envía ningún conjunto de filas al cliente.

Parece haber 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 # 2 también afectaría las consultas posteriores, por lo tanto, descarte la ejecución # 1 si lo desea.

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

Ricardo C
fuente
Ricardo C, buena investigación! ¿Qué versión de SQL Server usas? En el método MSSQL2000 con fechado, el rendimiento es un poco más rápido para mí.
aku
Solo para tener en cuenta, realicé la prueba 1000,000 veces. Para los escenarios del mundo real, la diferencia de rendimiento no será notable, supongo
aku
Aku, usé 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.
Ricardo C
Aku, mismos resultados. No hay diferencia en el rendimiento de más de diez millones de filas.
Ricardo C
55
Las afirmaciones sobre la igualdad de rendimiento no son ciertas. Por supuesto, los planes de ejecución serán los mismos. La medición del rendimiento en estos DEBE hacerse comparando el uso de la CPU, no examinando los planes de ejecución.
ErikE
51

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 preferido.

Nescio
fuente
55
Esto devuelve
'22
1
SELECT CONVERT (VARCHAR (10), GETDATE (), 101) es el mm/dd/yyyyformato.
Flea
44
si está ordenando según el valor de texto sin formato (fuera de la base de datos), entonces el formato 'japonés' es mejor
Simon_Weaver
40
SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
Cade Roux
fuente
21

Para devolución en formato de fecha

CAST (Fecha de pedido como fecha)

El código anterior funcionará en SQL Server 2010

Regresará como 12/12/2013

Para SQL Server 2012 use el siguiente código

CONVERT(VARCHAR(10), OrderDate , 111)
Mahesh ML
fuente
1
Esto me devuelve la fecha con tiempo cero, no solo la fecha
Bohemian
1
¿Puedo saber qué versión si servidor SQL está utilizando?
Mahesh ML
1
@MaheshML devuelve la fecha y la hora en MS SQL 2012.
Marek
1
Funciona como un encanto en SQL Azure
Martín Coll
55
@MaheshML No existe SQL Server 2010.
SvenAelterman
16

Si necesita el resultado como a varchar, debe 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 formato de fecha y hora, debe usar cualquiera de las consultas a continuación

  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

Stephon Johns
fuente
14
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
Rushda
fuente
13

Usando FLOOR () - solo corta parte del tiempo.

SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
DiGi
fuente
44
Este método no es el más rápido, y también enseña implícitamente a las personas que emitir fechas para flotar es preciso, lo cual no es así. Por favor vea esta publicación para más detalles.
ErikE
13

Si está utilizando SQL Server 2012 o versiones superiores ,

Utiliza la Format()función.

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 una mejor opción.

FORMAT ( value, format [, culture ] )

La opción 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        2011101

Si desea más formatos, puede ir a:

  1. Cadenas de formato estándar de fecha y hora
  2. Cadenas de formato de fecha y hora personalizadas
Somnath Muluk
fuente
12

SI desea usar CONVERTIR y obtener el mismo resultado que en la pregunta original planteada, es decir, aaaa-mm-dd, entonces use el CONVERT(varchar(10),[SourceDate as dateTime],121)mismo código que las respuestas anteriores, 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 tontos 'trucos' de gastos generales hasta SQL Server 2008, cuando los tipos de datos reales de datepart son introducido. Hacer tales conversiones en el nivel de datos es un gran desperdicio de gastos generales en su DBMS, pero lo más importante es que, en el momento en que hace algo como esto, básicamente ha creado datos huérfanos en 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 continuar y devolver su tipo de datos dateTime al programa de llamadas y, en el nivel PRESENTACIÓN, hacer los ajustes necesarios. Tan pronto como vaya a convertir 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 de ACTUALIZACIÓN o ELIMINACIÓN, de nuevo, a menos que realice algún tipo de reversión manual, que nuevamente exponga sus datos a un error humano / código / gremlin cuando no sea necesario.

Focusyn
fuente
1
Excepto, por ejemplo, si desea una consulta que recupere todos los registros que coincidan con una fecha proporcionada por el usuario como la parte de fecha de un determinado campo de tiempo. Buena suerte haciendo eso solo en la capa de presentación. (No necesita convertir, puede usar la aritmética de fechas, pero tiene la idea ...)
Andrew Lazarus
1
@ Andrew, ¿por qué importa eso? Usted dice WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);: no hay absolutamente ninguna razón para quitar tiempo de la columna.
Aaron Bertrand
1
@AaronBertrand Eso solo funciona asumiendo que la entrada @Datetiene 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 en 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 saber una forma rápida de truncar.
Andrew Lazarus el
1
@ Andrew todo lo que tienes que hacer es hacer que el parámetro de entrada sea DATE. Mi punto es que nunca deberías tener que aplicar ningún tipo de truncamiento a la columna , a pesar de que ese es el primer instinto de la mayoría de las personas.
Aaron Bertrand
1
@AaronBertrand y eso supone 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 estar seguro de que el parámetro es del tipo que desea y necesita?
Andrew Lazarus
10
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.

Gordon Bell
fuente
1
Todos estos métodos son geniales, pero ¿cuál sugieres usar?
eddiegroves
3
Tenga en cuenta que la versión "correcta" de los dos primeros es select dateadd(dd, datediff(dd, 0, getdate()), 0), porque los dds se pueden cambiar por cualquiera de las datepartpalabras clave para recortar la fecha en cualquier segmento que elija. (También tenga en cuenta que ddes solo una abreviatura de day.)
Michael - ¿Dónde está Clay Shirky el
10

Para obtener el resultado indicado, utilizo el siguiente comando.

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

Espero que sea útil.

Anderson Silva
fuente
8
 Convert(nvarchar(10), getdate(), 101) --->  5/12/14

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

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

DECLARE @Date DATE = GETDATE()   

SELECT @Date   --> 2017-05-03
Art Schmidt
fuente
6

Creo que esto funcionaría en tu caso:

CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
//here date is obtained as 1990/09/25
bishnu karki
fuente
6
DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
SELECT CONVERT(DATE, @yourdate)
etni
fuente
2
Esta sugerencia ha sido cubierta por otras respuestas (más de una vez).
Andriy M
6

De acuerdo, aunque llego un poco tarde :), esta es 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 una FORMAT()función como esta:

SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
Krishnraj Rana
fuente
Su primer ejemplo todavía tiene un componente de tiempo. El punto de la pregunta era cómo eliminar eso.
Zack
5

Incluso usando 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)

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
tumultous_rooster
fuente
5

Fecha:

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

Hora:

CONVERTIR SELECCIONAR (hora, OBTENER (), 114)
SELECCIONAR CAST (GETDATE () como hora)
Kris Khairallah
fuente
5

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
Amar Srivastava
fuente
4

¿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

Janaka R Rajapaksha
fuente
4

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 soportar la variable ANSI CURRENT_DATE estándar.

iluminado
fuente
select {fn current_date()} as todayfunciona para mi.
brianary
@brianary: eso es bueno, pero no es ANSI SQL.
encendido
Eso es bastante justo, y su respuesta es agradablemente portátil, pero pensé que mientras trabajemos con T-SQL, esto también funciona (y muestra que implementar ANSI CURRENT_DATE sería trivial para MS).
brianary
4

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 o hacer una doble conversión, aunque cada 'datepart' probablemente haga matemáticas. Por lo tanto, puede ser un poco más lento que el método anticuado, pero para mí es mucho más claro. Especialmente cuando quiero agrupar solo por año y mes (establezca el día en 1).

Gerard ONeill
fuente
4

A partir de SQL SERVER 2012, puede hacer esto:

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

xbb
fuente
4

En SQL Server 2000

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

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

CONVERTIR SELECCIONAR (VARCHAR (10), getdate (), 111);ingrese la descripción de la imagen aquí

Mohammad Neamul Islam
fuente
Esta debería ser la respuesta aceptada.
noobprogrammer
3

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

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

DATEADD => La DATEPART()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 entero que representa la parte de fecha especificada de la fecha especificada.

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

usuario1151326
fuente