날짜를 정수 (숫자)로 저장하면 어떤 이점이 있습니까?


11

질문 1

날짜가 정수 (실제 숫자 (8,0))로 저장된 시스템으로 작업 중이며 다른 시스템 도이 스레드의 cisco 와 같은 날짜를 int로 저장하는 것을 알았습니다 . 예

20120101  -- 01 Jan 2012

숫자 날짜 시스템을 유지하고 SQL 날짜 시간을 사용하지 않는 이점이 있습니까?

질문 2

이제 두 날짜 사이의 고객을 찾기 위해 숫자 날짜를 반복하려고합니다. startand가 enddate2 개월 인 경우 60 개가 아닌 수천 개의 레코드를 얻습니다. 예 :

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

60 대신 8931 레코드를 가져옵니다. 위의 논리를 개선하는 더 좋은 방법이 있습니까? IsDate와 하위 쿼리를 시도했지만 효율적으로 작동하지 않았습니다.


SQL Server 2008 이상을 실행하는 경우 실제로 날짜 데이터 형식 만 사용할 수 있습니다. 조금 작고 시간을 포함 시키지는 않지만 거의 모든 SQL의 날짜 시간 함수가 여전히 작동합니다.
DForck42

2
나는 단지이 방법에 어떠한 장점이 단점을 볼 수 없습니다
a_horse_with_no_name

답변:


11

첫 번째 질문에 대답하려면 DATETIMESQL Server 내 에서 데이터 형식을 사용하는 것이 좋습니다 . 반드시 성능상의 이유가 아니라 RDBMS 관련 기능을 활용하십시오. 예를 들어, 당신은 단지 기본 날짜 계산을하기 위해 많은 로직을 다시 발명해야한다 (생각 DATEDIFF(), DATEADD(), DATEPART()그리고 많은 다른 기능을합니다. 그들은 분명히에 맞는 DATETIME데이터 형식과 함께 작동하도록 쉽게).

두 번째 질문에 관해서 는 첫 번째 질문 (및 내 대답)이 향한 정확한 문제에 직면하고 있습니다. 당신 은 날짜로 20111201과 20120131을보고 있으며, 뇌는 60 일의 차이가 있어야한다고 말합니다. 글쎄, 당신은 델타를 기반으로 반복하고 있습니다 ...

20120131 - 20111201 = 8930 (포괄 루프를 사용하면 8931이됩니다)

다시 말해, WHILE루프가 8931 번 실행 중입니다. 이것은 정수 값이므로 루프가 20111231에서 20120101로 바로 이동하지 않기 때문에 발생합니다.

정수는 년과 월의 한도를 고려하지 않을 것입니다 (즉, 질문 2 문제).


그게 내 질문이야 숫자 날짜의 경우 루프는 30 일 또는 29 일이 아니라 수천으로 진행될 수 있습니다. 그러나 나는 전문 시스템을 가지고 일하고 있다는 것을 명심하십시오 . 그리고 시스코조차도 그것을 사용합니다.
Jackofall

4
성능과 기능 외에도 무결성도 있습니다. 날짜와 같은 정수로, DB를 허용 할 2012130120120230심지어 20129999날짜로.
ypercubeᵀᴹ

@Jackofall Cisco에는 RDBMS 플랫폼이 없습니다. 그들은 자신의 논리를 썼습니다. 왜 정수만 사용 하지 않습니까? 처음부터 이것은 아마도 저수준 소프트웨어를위한 가장 쉬운 방법 일 것입니다. 그러나 우리는 여기서 사과와 오렌지에 대해 이야기하고 있습니다.
Thomas Stringer

3
@Jackofall : 날짜를 정수로 저장하고 공백을 갖는 것과 날짜 시간 / 타임 스탬프를 정수로 저장하는 것 또는 VB / Excel과 같이 정수로 날짜를 저장하는 것에는 큰 차이가 있습니다.
ypercubeᵀᴹ

4
나쁜 기술을 사용하는 전문적으로 설계된 많은 데이터베이스가 있습니다 (대부분은 아니지만). 나는 많은 COTS 제품으로 작업했지만 데이터베이스 관점에서 잘 이해되지 않았습니다.
HLGEM

6
  1. Ralph Kimball은 날짜를 정수로 저장하도록 권장합니다. 그는 온라인 기사와 책 모두를 많이 썼습니다.
  2. 다음과 같이 달력 테이블을 사용하여 날짜에 연속 번호를 발행 할 수 있습니다.

    날짜 번호

    20120229 1234

    20120301 1235

달력 테이블을 생성해야하지만 매우 쉬운 작업입니다.


1
날짜가 숫자로 저장된 날짜 테이블에 조인하여 쿼리를 필터링하고 해당 숫자 날짜를 필터링하면 "@startdate와 @enddate 사이의 [date]"를 사용하여 이길 수 있습니다.
DForck42

1
@ DForck42는 "20120229와 20120329 사이의 [dateAsInt]"는 "20120229 '와'20120329 '사이의 [dateAsInt]"와 정확히 동일한 행을 반환합니다.
AK

3
그리고 그의 추론은 무엇입니까?
HLGEM

5

잠재적 인 데이터 유형 및 크기 / 제한 :

  • 10 진수 (8,0) : 5 바이트
  • 날짜 : 3 바이트, 0001-01-01 ~ 9999-12-31
  • 정수 : 4 바이트

숫자 데이터 유형의 장점 :

  • 예뻐요?

숫자 데이터 형식의 단점 :

  • 날짜 작업 처리를위한 사용자 지정 코드 필요
  • 올바른 날짜를 관리하려면 맞춤 코드가 필요합니다 (예 : 20120230 [2012 년 2 월 30 일]을 허용하지 않음)
  • 날짜 데이터 유형과 비교할 때 더 큰 데이터 공간.

솔직히 날짜 데이터 유형 IMHO를 사용하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.