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?
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?
Respuestas:
En SQL Server 2008
adelante, debes CONVERT
fechar:
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:
varchar
<-> datetime
conversioneslocale
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
datetime
tipo 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.
CAST(... AS DATE)
o CONVERT(DATE, ...)
, que se ha mencionado con bastante frecuencia en esta misma página.
SELECT DATEADD(dd, DATEDIFF(dd, 0, @your_date), 0)
porque luego se dd
puede cambiar por cualquier otra datepart
palabra clave para truncar su datetime
nivel arbitrario.
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())
Si usa SQL 2008 y superior:
select cast(getdate() as date)
DateTime2
en su lugar y funciona bien. sqlfiddle.com/#!6/9eecb7/2833
2015-10-01
debe a DateTime
limitaciones. 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
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.
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.
mm/dd/yyyy
formato.
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)
Puede usar la CONVERT
función para devolver solo la fecha. Vea los enlaces a continuación:
Manipulación de fecha y hora en SQL Server 2000
La sintaxis para usar la función de conversión es:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
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
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 111)) AS OnlyDate
2014-03-26 00: 00: 00.000
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 112)) AS OnlyDate
2014-03-26 00: 00: 00.000
DECLARE @OnlyDate DATETIME
SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
SELECT @OnlyDate AS OnlyDate
2014-03-26 00: 00: 00.000
Usando FLOOR () - solo corta parte del tiempo.
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
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).
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)
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:
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.
WHERE col >= @Date AND col < DATEADD(DAY, 1, @Date);
: no hay absolutamente ninguna razón para quitar tiempo de la columna.
@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 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.
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.
select dateadd(dd, datediff(dd, 0, getdate()), 0)
, porque los dd
s se pueden cambiar por cualquiera de las datepart
palabras clave para recortar la fecha en cualquier segmento que elija. (También tenga en cuenta que dd
es solo una abreviatura de day
.)
Para obtener el resultado indicado, utilizo el siguiente comando.
SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
Espero que sea útil.
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, dele el tipo DATE y la conversión es 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
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')
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
Fecha:
SELECCIONAR CONVERTIR (fecha, OBTENER ()) SELECCIONAR CAST (GETDATE () como fecha)
Hora:
CONVERTIR SELECCIONAR (hora, OBTENER (), 114) SELECCIONAR CAST (GETDATE () como hora)
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 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.
select {fn current_date()} as today
funciona para mi.
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).
En este caso, solo fecha, vamos a ejecutar esta consulta:
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.