numero fecha ejemplo convertir convert mysql sql tsql datetime

mysql - fecha - Tiempo de caída en DateTime



sql server date to string format (16)

Sé que no son lo mismo, pero las fechas son, ¿está ahí en SQL para dejar caer fácilmente el tiempo y mantener solo las fechas para la comparación? Gracias

bien, si el tipo de datos del campo es smalldatetime en lugar de datetime , solo podrá usar y actualizar fechas, el tiempo siempre será 00: 00: 000 sin importar lo que esté insertando.

Para evitar problemas con las fechas, yo personalmente siempre uso

CONVERT( smalldatetime, @myDate, 103 )

sido 103 ( puedes ver en la Ayuda ) es dd / mm / aaaa y funciona bien conmigo, uso esta técnica porque uso el formato de fecha británico / francés y los servidores están en EE. UU., donde lo cambian todo :-RE

fue la única idea que apareció en mi cabeza en ese momento (hace 6 años) y me quedé con ella.

Pero, puede pensar que, en lugar de agregar un campo DateTime , agregar un int y colocar el número de segundos desde 01-01-1970, nunca tendrá problemas de fecha, y cada vez que necesite obtener la fecha, solo reste el fecha actual esos segundos.

Esta técnica es muy utilizada en grandes programas para evitar problemas, por ejemplo, la conocida aplicación CRM llamada SuperOffice.

Tengo un problema donde mi mesa almacena la fecha como

2009-01-10 10:00:00.000

y tengo otra mesa que almacena la fecha como

2009-01-10 12:00:00.000

Sé que no son lo mismo, pero las fechas son, ¿está ahí en SQL para dejar caer fácilmente el tiempo y mantener solo las fechas para la comparación? Gracias.


Aquí hay una forma:

declare @d datetime set @d = getdate() select dateadd(d, datediff(day, 0, @d), 0)


Ejecuta esto

SELECT DATEADD(dd, DATEDIFF(d, 0, Getdate()), 0)

cambie Getdate () a su nombre de columna para quitar la fecha

Por cierto, si está haciendo una comparación, es mejor hacer> = y <, ya que funcionará mejor


En Oracle puedes hacer un trunc (DateTime) que elimina el componente de tiempo. (Hay variaciones como trunc (DateTime, ''MONTH'') que da la primera fecha del mes.) No estoy seguro si esto es SQL estándar, pero estoy seguro de que habría funciones similares en otras bases de datos.

Esto debería ser mucho más rápido que trabajar con una función de conversión.


Hay muchas buenas sugerencias para tomarse el tiempo de espera, pero si solo está buscando una forma de comparar días sin considerar el componente de tiempo simplemente haga esto:

Select * From SomeTable Where (DateDiff(d, FirstDate, SecondDate) = 0)

Es decir, use DateDiff con un argumento "d" para hacer su comparación en lugar de "=".

Por si acaso eso es lo que realmente buscas ...


La sugerencia de SQLMenaces es, en mi opinión, la manera más rápida de descontar el tiempo de una fecha. Sin embargo, también hace que algunas consultas resuenen como un cerdo al eliminar la capacidad de usar índices ...

[A] JOIN [B] ON SQLMenace([A].datetime) = SQLMenace([B].datetime) (Where SQLMenace() is the operation he described *grin*)

Para usar permite el uso de INDEXes en la 2da mesa, solo necesita una pequeña adaptación ...

[A] JOIN [B] ON [A].datetime >= SQLMenace([B].datetime) AND [A].datetime < SQLMenace([B].datetime)

Esto debería provocar un escaneo en [B] y búsquedas de índice en [A] ...


Mi forma favorita de solo mostrar (y comparar) en la fecha es usar:

convert(char(10),getdate(),101)

donde getdate () puede ser su valor de fecha y hora.

creo que se convierte al formato de MM / DD / YYYY


Mi sugerencia es decidir sobre un estándar y cambiar una de las tablas para que coincida con el otro. De lo contrario, su código de aplicación tendrá que recordar qué tabla utiliza qué método para siempre. Decida sobre un estándar y quédese con él. Si es verdad que siempre es medianoche en una tabla y siempre es mediodía en la otra tabla, la porción de tiempo de la fecha no tiene ningún significado de todos modos.


Si está utilizando MS SQL Server 2008, también puede cambiar al nuevo tipo de datos DATE en lugar de utilizar DATETIME.


StingyJack tiene razón, pero dependiendo de lo que quieras hacer, es mejor que el servidor almacene la fecha como un entero si nunca necesitas la parte de tiempo.

create table #datedemo( id integer primary key identity(1,1) not null ,date datetime not null ,dateint int ) insert into #datedemo (date) select ''2009-Jan-29 02:12:00'' union all select ''2009-Jan-29 16:22:00'' union all select ''2009-Jan-30 00:32:00'' union all select ''2009-Jan-30 13:42:00'' union all select ''2009-Jan-31 01:52:00'' union all select ''2009-Feb-01 12:02:00'' update #datedemo set dateint = floor(cast(date as float)) select id,date,dateint,cast(dateint as datetime) from #datedemo where dateint = floor(cast(cast(''2009-Jan-30'' as datetime)as float)) drop table #datedemo


Todas estas soluciones (con la excepción de la publicación del tipo de datos SQL Server 2008) son soluciones basadas en filas. Funcionarán bien en situaciones de mesa pequeña, pero se agitarán en cajas de mesa muy grandes. Si no está en 2008, ¿tiene la opción de almacenar la fecha como campos enteros separados para el año, mes y día o como un cálculo a partir de una fecha fija?


Una función SQL CLR como esta debería ser:

public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static SqlDateTime StripTime(SqlDateTime date) { return date.IsNull ? SqlDateTime.Null : new SqlDateTime(date.DayTicks, 0); } };


Puedes usar esta sintaxis:

CAST(date_field AS DATE) as column_name


Mira aquí

Quieres el primero.

SELECT (CAST(FLOOR(CAST(GETDATE() as FLOAT)) AS DateTime))

No use conversiones a varchar, son lentos.

EDITAR : @feihtthief - Aquí hay una manera de completar una tabla de fechas (con 0 veces) desde una tabla de números temp que sea FAST. Edítelo para guardar la tabla de números si lo desea. También son útiles.

DECLARE @DaysFromGoLive int SET @DaysFromGoLive = (SELECT (DATEDIFF(dd,''10/01/2007'',GETDATE()) + 1)) /* Days from go live is the starting date of the table */ SELECT TOP 10950 --30 years of days IDENTITY(INT,1,1) as N INTO #Numbers FROM Master.dbo.SysColumns sc1, Master.dbo.SysColumns sc2 CREATE TABLE [dbo].[TableOfDates]( [fld_date] [datetime] NOT NULL, CONSTRAINT [PK_TableOfDates] PRIMARY KEY CLUSTERED ( [fld_date] ASC )WITH FILLFACTOR = 99 ON [PRIMARY] ) ON [PRIMARY] INSERT INTO dbo.TableOfDates SELECT DATEADD(dd,nums.n - @DaysFromGoLive,CAST(FLOOR(CAST(GETDATE() as FLOAT)) as DateTime)) as FLD_Date FROM #Numbers nums SELECT MIN(FLD_Date) FROM dbo.TableOfDates SELECT MAX(FLD_Date) FROM dbo.TableOfDates DROP TABLE #Numbers


Convertir a varchar es LENTO. No lo hagas La solución Datediff es la más rápida, y si comparas con una fecha, ni siquiera tienes que usar dateadd (o convertir alternativamente a datetime) ya que el entero se comparará implícitamente con una fecha sin problemas, como en:

WHERE SomeDate = DateDiff(d, 0, GetDate())

La sugerencia de Mark Brittingham sobre una unión entre dos mesas es bastante buena. Y para comparar con una sola fecha, como se sugiere, use:

WHERE A.Dt >= @SomeDate AND A.Dt < @SomeDate + 1


Dependiendo de tu razón para poner a cero el tiempo ...

Para mí, a menudo ha sido así que pude comparar dos fechas . En ese caso, es mejor que se quede con comparaciones> =, <= (evitar =, <>) si puede. De esta forma, puede hacer las comparaciones en su cláusula WHERE sin perder el beneficio de su índice.

Si está en SQl-Server 2008, ahora tiene un tipo de datos DATE (que no incluye el tiempo)

Puede usar algún formato de almacenamiento creativo, por ejemplo, una pequeña imagen (la mitad del tamaño de una fecha pequeña) de YYDDD, donde DDD es la fecha juliana (cada día del año está numerado secuencialmente de 1 a 365). Este es un tipo de datos más pequeño, y válido para las comparaciones>, =, <. Drawback es tener que convertir fechas externas a este formato (o viceversa) antes de hacer una comparación.

Supongo que una última cosa a considerar es evitar que los datos de tiempo se almacenen en primer lugar.

También puede hacer YEAR() , MONTY() , etc., que devolverá valores enteros. Puede que no sea lo mejor para comparar fechas, pero útil para formatear, etc.