insertar fecha example entre ejemplo diferencia convert sql-server database tsql datetime

example - ¿Comparar una cadena de fecha a fecha y hora en SQL Server?



insert datetime sql server (18)

En SQL Server tengo una columna DATETIME que incluye un elemento de tiempo.

Ejemplo:

''14 AUG 2008 14:23:019''

¿Cuál es el mejor método para seleccionar solo los registros de un día en particular, ignorando la parte de tiempo?

Ejemplo: (No es seguro, ya que no coincide con la parte de tiempo y no devuelve filas)

DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, ''14 AUG 2008'', 106 ) SELECT * FROM table1 WHERE column_datetime = @p_date

Nota: Dado que este sitio también trata de apuntar notas y técnicas que retoma y luego olvida, voy a publicar mi propia respuesta a esta pregunta ya que las cosas de DATETIME en MSSQL es probablemente el tema que busco más en SQLBOL.

Actualizar ejemplo aclarado para ser más específico.

Editar Lo siento, pero he tenido que modificar las respuestas INCORRECTAS (respuestas que arrojan resultados incorrectos).

@Jorrit: WHERE (date>''20080813'' AND date<''20080815'') volverá el 13 y el 14.

@wearejimbo: Cerrar, ¡pero no cigarro! insignia otorgada a ti. Perdió los registros escritos el 14/08/2008 23: 59: 001 a 23: 59: 999 (es decir, menos de 1 segundo antes de la medianoche).


¿Algo como esto?

SELECT * FROM table1 WHERE convert(varchar, column_datetime, 111) = ''2008/08/14''


Esta función Cast (Floor (Cast (GetDate () As Float)) Como DateTime) devuelve un tipo de datos de fecha y hora con la porción de tiempo eliminada y podría usarse como tal.

Select * Table1 Where Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = ''14-AUG-2008''

o

DECLARE @p_date DATETIME SET @p_date = Cast(''14 AUG 2008'' as DateTime) SELECT * FROM table1 WHERE Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date


Sé que esto no es exactamente cómo quieres hacer esto, pero podría ser un comienzo:

SELECT * FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, DATEPART(mm, column_dateTime) as Month, DATEPART(dd, column_dateTime) as Day FROM table1) WHERE Year = ''2008'' AND Month = ''8'' AND Day = ''14''


Simplemente compare los valores de año, mes y día.

Declare @DateToSearch DateTime Set @DateToSearch = ''14 AUG 2008'' SELECT * FROM table1 WHERE Year(column_datetime) = Year(@DateToSearch) AND Month(column_datetime) = Month(@DateToSearch) AND Day(column_datetime) = Day(@DateToSearch)


Técnica 2:

DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, ''14 AUG 2008'', 106 ) SELECT * FROM table1 WHERE DATEDIFF( d, column_datetime, @p_date ) = 0

Si el campo column_datetime no está indexado, y es poco probable que lo sea (o es poco probable que se use el índice), entonces usar DATEDIFF () es más corto.


SELECT * FROM table1 WHERE CONVERT(varchar(10),columnDatetime,121) = CONVERT(varchar(10),CONVERT(''14 AUG 2008'' ,smalldatetime),121)

Esto convertirá el datatime y la cadena en varchars del formato "AAAA-MM-DD".

Esto es muy feo, pero debería funcionar


En SQL Server 2008, podría usar el nuevo tipo de datos DATE

DECLARE @pDate DATE=''2008-08-14'' SELECT colA, colB FROM table1 WHERE convert(date, colDateTime) = @pDate

@Chico. Creo que encontrará que esta solución se escala bien. Eche un vistazo al plan de ejecución de consulta de su consulta original.

Y para el mío :


Cómo obtener la parte DATE de un campo DATETIME en MS SQL Server:

Una de las maneras más rápidas y perfectas de hacer esto es usar

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

Evita que la CPU revienta "convertir la fecha en una cadena sin tiempo y luego volver a convertirla" en lógica.

Tampoco expone la implementación interna que la "porción de tiempo se expresa como una fracción" de la fecha.

Obtenga la fecha del primer día del mes

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

Obtenga la fecha de hace 1 año

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))


Buen punto sobre el índice en la respuesta que aceptó.

Aún así, si realmente busca solo en DATE ranges específicos de DATE o DATE ranges , la mejor solución que encontré es agregar otra columna calculada persistente a su tabla que solo contenga el DATE y agregar índice en esta columna:

ALTER TABLE "table1" ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED

Agregar índice en esa columna:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci" ON "table1" ( "column_date" ASC ) GO

Entonces tu búsqueda será aún más rápida:

DECLARE @p_date DATE SET @p_date = CONVERT( DATE, ''14 AUG 2008'', 106 ) SELECT * FROM table1 WHERE column_date = @p_date


La fecha se puede comparar en sqlserver usando la comparación de cadenas: por ej.

DECLARE @strDate VARCHAR(15) SET @strDate =''07-12-2010'' SELECT * FROM table WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)


Normalmente convierto la fecha y hora a la fecha y los comparo, como estos:

SELECT ''Same Date'' WHERE CAST(getDate() as date) = cast(''2/24/2012 2:23 PM'' as date)

o

SELECT ''Same Date'' WHERE DATEDIFF(dd, cast(getDate() as date), cast(''2/24/2012 2:23 PM'' as date)) = 0


Técnica 1:

DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, ''14 AUG 2008'', 106 ) SELECT * FROM table1 WHERE column_datetime >= @p_date AND column_datetime < DATEADD(d, 1, @p_date)

La ventaja de esto es que usará cualquier índice en ''column_datetime'' si existe.


La mejor forma es simplemente extraer la parte de fecha usando la función SQL DATE ():

SELECT * FROM table1 WHERE DATE(column_datetime) = @p_date;


En sqlserver

DECLARE @p_date DATE SELECT * FROM table1 WHERE column_dateTime=@p_date

En C # Pase la cadena corta de valor de fecha usando la función ToShortDateString (). muestra: DateVariable.ToShortDateString ();


DECLARE @Dat SELECT * FROM Jai WHERE CONVERT(VARCHAR(2),DATEPART("dd",Date)) +''/''+ CONVERT(VARCHAR(2),DATEPART("mm",Date)) +''/''+ CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat


SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + ''/'' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + ''/'' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp


SELECT * FROM tablename WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = ''30 jan 2012''


Hay muchos formatos de fecha en SQL que se están especificando. Consulte https://msdn.microsoft.com/en-in/library/ms187928.aspx

Conversión y comparación de la columna varchar con las fechas seleccionadas.

Sintaxis:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) between ''2016-03-01'' and ''2016-03-03''

In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy