Pytanie 1
Pracuję z systemem, w którym data jest przechowywana jako liczba całkowita (rzeczywista liczba (8,0)) i zauważyłem, że inne systemy również przechowują datę jako int, np. Cisco w tym wątku . Przykład
20120101 -- 01 Jan 2012
Czy jest jakaś korzyść z utrzymywania liczbowego systemu dat i niestosowania SQL Datetime?
pytanie 2
Teraz próbuję przeglądać datę numeryczną, aby znaleźć klientów między dwiema datami. Jeśli start
i enddate
obejmują dwa miesiące, otrzymuję tysiące rekordów zamiast tylko 60. Przykład:
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
Spowoduje to pobranie 8931 rekordów zamiast 60. Czy istnieje lepszy sposób na ulepszenie logiki powyżej, aby pobierać tylko prawidłowe daty? Próbowałem IsDate i zapytań podrzędnych, ale nie działało to skutecznie.
sql-server
sql-server-2008
date-format
Jackofall
źródło
źródło
Odpowiedzi:
Aby odpowiedzieć na pierwsze pytanie, zaleciłbym użycie
DATETIME
typu danych w SQL Server. Niekoniecznie ze względu na wydajność, ale w celu wykorzystania funkcjonalności specyficznej dla RDBMS. Na przykład, trzeba by wymyślać wiele logiki tylko zrobić podstawowe datę matematyki (myślęDATEDIFF()
,DATEADD()
,DATEPART()
i wiele innych funkcji. Oczywiście są one dostosowane doDATETIME
typu danych i są łatwe do pracy z).Jeśli chodzi o twoje drugie pytanie, natrafisz na dokładny problem, do którego zmierza pierwsze pytanie (i moja odpowiedź) . Ty patrzysz 20111201 i 20120131 jak daty, a twój mózg jest informacją, która powinna być różnica 60 dni. Zapętlasz się w oparciu o deltę ... czyli:
20120131 - 20111201 = 8930
(z włączoną pętlą będzie 8931)Innymi słowy, twoja
WHILE
pętla wykonuje 8931 razy. Dzieje się tak, ponieważ są to liczby całkowite, a Twoja pętla nie przeskoczy z 20111231 bezpośrednio do 20120101.Wy, liczby całkowite, nie weźmiecie pod uwagę limitu lat i miesięcy (tj. Problemu z pytaniem 2 ).
źródło
20121301
a20120230
nawet20129999
jako data.Możesz użyć tabeli kalendarza i wydawać kolejne numery swoim datom w następujący sposób:
Numer daty
20120229 1234
20120301 1235
Tabela kalendarza musi zostać wygenerowana, ale jest to bardzo łatwe zadanie.
źródło
Potencjalne typy danych i ich rozmiary / ograniczenia:
Plusy dla numerycznego typu danych:
Wady dla numerycznego typu danych:
Szczerze mówiąc, lepiej jest użyć typu danych IMHO.
źródło