Pregunta 1
Estoy trabajando con un sistema donde la fecha se almacena como un número entero (numérico real (8,0)) y he notado que otros sistemas también almacenan la fecha como int como cisco en este hilo . Ejemplo
20120101 -- 01 Jan 2012
¿Hay alguna ventaja de mantener el sistema de fecha numérico y no usar SQL Datetime?
Pregunta 2
Ahora estoy tratando de recorrer la fecha numérica para encontrar clientes entre dos fechas. Si start
y enddate
abarca dos meses, obtengo miles de registros en lugar de solo 60. Ejemplo:
create table #temp1(day int,capacity int) /* just a temp table */
declare @start int
declare @end int
set @start=20111201
set @end = 20120131
while (@start <= @end)
Begin
insert into #temp1 /* I am storing things in #temp table so data looks pretty */
exec usp_GetDailyCap @date1= @start
set @start = @start + 1;
end
select * from #temp1
Esto extrae 8931 registros en lugar de 60. ¿Hay una mejor manera de mejorar la lógica anterior para que solo extraiga fechas válidas? Intenté IsDate y las subconsultas, pero eso no funcionó de manera eficiente.
sql-server
sql-server-2008
date-format
Jackofall
fuente
fuente
Respuestas:
Para responder a su primera pregunta, recomendaría usar el
DATETIME
tipo de datos dentro de SQL Server. No necesariamente por razones de rendimiento, sino para aprovechar la funcionalidad específica de RDBMS. Por ejemplo, tendría que volver a inventar un montón de lógica sólo para hacer operaciones matemáticas básicas fecha (creeDATEDIFF()
,DATEADD()
,DATEPART()
y muchas otras funciones. Es evidente que están adaptados alDATETIME
tipo de datos y son fáciles de trabajar con).En cuanto a su segunda pregunta, se encuentra con el problema exacto al que se dirige la primera pregunta (y mi respuesta) . Estás viendo 20111201 y 20120131 como fechas, y tu cerebro te dice que debería ser una diferencia de 60 días. Bueno, estás recorriendo en base al delta ... que es:
20120131 - 20111201 = 8930
(con el bucle inclusivo será 8931)En otras palabras, su
WHILE
ciclo se está ejecutando 8931 veces. Esto está sucediendo porque esos son valores enteros y su ciclo no saltará de 20111231 directamente a 20120101.Sus enteros no van a tener en cuenta el límite de años y meses (es decir, su problema de la Pregunta 2 ).
fuente
20121301
e20120230
incluso20129999
como una fecha.Puede usar una tabla de calendario y emitir números consecutivos a sus fechas, de la siguiente manera:
Número de fecha
20120229 1234
20120301 1235
Se debe generar la tabla de calendario, pero es una tarea muy fácil.
fuente
Tipos de datos potenciales y sus tamaños / limitaciones:
Pros para el tipo de datos numéricos:
Contras para el tipo de datos numéricos:
Honestamente, es mejor usar el tipo de datos de fecha en mi humilde opinión.
fuente