2009-02-04 6 views
10

SQL Server 2005에서 오래된 날짜 (1753 이전)를 저장하는 가장 효과적인 방법은 무엇입니까? 나는 시간을 저장하는 것에 관심이 없다 - 단지 날짜. SQL Server의 datetime 데이터 형식은 1753 년 1 월 1 일까지만 데이터를 저장할 수 있습니다. MSDN 설명서에 date 및 datetime2 데이터 형식이 있지만 SQL Server Management Studio에서 지원하지 않는 것 같습니다 (오류 : 잘못된 데이터 형식).SQL Server에 이전 날짜를 저장하는 가장 좋은 방법

날짜를 "YYYYMMDD"형식의 문자열 또는 정수로 저장하는 것이 얼마나 비효율적입니까? 나는 내 테이블 (StartDate 및 EndDate)에서 두 개의 날짜 필드에 대해 많은 질의 및 정렬 작업을 수행한다.

UPDATE :

별도의 필드에 저장 년, 월, 일에 아래에 몇 가지 제안이 있었다. 단일 정수 필드가 아닌 다른 필드에 파트를 저장하면 어떤 이점이 있습니까?

+0

1 대신 3 개의 정수를 사용하면 CodeMonkey1에서 제안한대로 일수를 계산할 필요가 없다는 장점이 있습니다. . 그것은 소리보다 어렵습니다. – Treb

+0

날짜와 관련된 날짜는 무엇입니까? 당신은 [그레고리오 대 줄리안 캘린더 문제를 고려해야 할 수도 있습니다] (http://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1-1753-in-sql-server/3310588#3310588)) –

답변

15

date 유형은 확실히 당신이 원하는 것입니다. 그 범위는 "1 월 1 일 주일, 9999 년 12 월 31 일까지 주후." 또한 시간 부분없이 날짜 정보 만 저장합니다.

아마도 2008 년이 아닌 SSMS 2005를 사용하고 있습니까, 아니면 2005 인스턴스에 연결되어 있습니까? 해당 유형은 introduced in SQL Server 2008입니다. 2008 데이터베이스를 사용할 수있는 능력이 있다면 의심의 여지없이 갈 길이 멀다고 생각합니다.

+0

가 업그레이드 이유처럼 들립니다. – inspite

4

필자는 이것을 해 본 적이 없지만 최소 날짜가 어울리는 날부터 일 수를 나타내는 정수로 날짜를 저장할 수 있습니다. 그런 다음 해당 정수를 1 년, 1 개월 및 1 일로 매핑하는 조회 테이블을 만들거나 정수에서 날짜로 또는 그 반대로 변환 할 수있는 사용자 정의 함수를 작성할 수 있습니다.

선택 및 정렬면에서 상당히 효율적이어야합니다.

4

문자열은 아마도 년, 월 및 일의 정수를 저장하는 것보다 덜 효율적일 것입니다. 이는 쿼리에서 좀 더 자세한 설명이지만, 수행중인 쿼리의 종류에 맞는 방식으로 인덱싱 할 수 있으므로 더 빨리 실행됩니다. 그래서 예를 들면

:

CREATE TABLE myOldDates (
    year INT, 
    month INT, 
    day INT, 
    -- otherstuff ... 
) 

다음 쿼리는 모든 것이 같은 : 확실히, 추한,하지만 그래서,이 범위 쿼리에 도착만큼이나 추한

-- get records between 5/15/1752 and 3/19/1754 
SELECT * FROM myOldDates 
    WHERE 
    (year = 1752 AND ((month = 5 and day >= 15) or month > 5) OR year > 1752) 
    AND (year = 1754 AND ((month = 3 and day <= 19) or month < 3) OR year < 1754) 

처음 쓰면 함수에 캡슐화 할 수 있습니다.

1

YYYYMMDD 형식으로 날짜를 저장하는 데 따른 한 가지 문제점은 존재하지 않는 날짜 (예 : 16000231 - 2 월 31 일이 존재하지 않음)로 끝날 수 있다는 것입니다. db에 입력하기 전에 일부 유효성 검사 클라이언트 측을 수행해야합니다.

Ian Varley에 의해 제안 된 것과 같이 년, 월 및 일 정수로 날짜를 저장하는 경우에도 마찬가지입니다. 그러나 나는 그의 대답을 좋아한다. 나는 그것을 생각했을 것이다. ;-)

+0

모든 외부 고객으로부터받은 데이터에 대해 모든 적절한 클라이언트는 무엇을합니까? :) (힌트 : 유효 함) – Esko

+0

. 내장 된 날짜 유형이 유효성 검사를 수행하기 때문에 날짜를 처리 할 때 그저 뭔가를 간과 할 수 있습니다. – Treb

1

YYYYMMDD = 8 바이트. 3 열을 사용하여 SMALLINT 및 TINYINT로 4 바이트로 줄일 수 있습니다.

1

CodeMonkey1에서 제안한 ints를 사용하면 좋은 생각 인 것처럼 보일 수 있으며 "날짜 계산"(예 : 일부 날짜 + XX 일)을 쉽게 수행 할 수 있습니다.> YYYYMMDD - -

INT 변환 (도 CodeMonkey1에 의해 권고로) 일부 UDF를 쓰기> INT와 이안 Varley는 그의 대답에 언급 것을 당신은 유연성을해야합니다.

1

아이디어 - 일부 .NET 지식이 있으면 날짜를 저장하기 위해 CLR 유형을 만들 수 있습니다. 기본적으로 날짜/시간입니다. 간단한 쿼리가 아닌 날짜 계산을 많이한다면 조사 할 대상이 될 수 있습니다

관련 문제