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