database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
ㆍ자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
자유게시판 자유게시판 5248 게시물 읽기
 
No. 5248
심심풀이 두번째 - 이젠 심심의 범위를 떠난 것 같지만.
작성자
김상기(ioseph)
작성일
2006-07-12 14:21ⓒ
2006-07-12 14:24ⓜ
조회수
8,735

자, 그럼,

2000년 1월 1일부터 1000년 2월 28일까지

그 사이에 몇일이 있었는지 계산해 봐야할 것같네요.

 

만일 제대로 만들어진 DB라면, 모든 DB가 그 결과가 같아야할 것같네요.

 

그레고리오 달력이든 아니든, 섬세하게 고려를 했던 안했든,

이 날짜 빼기 (interval 계산)은 모든 DB가 동일해야 할 것같네요.

 

이게 같지 않다면, 문제가 심각해 지겠네요. :)

 

PostgreSQL 쪽에서는 결과가 아래와 같았습니다.

 

> select '2000-01-01'::date - '1000-02-28'::date;
?column?
----------
365184

 

참, 문제의 소지가 있으니, 시간은 KST (한국 표준 시간) 기준으로 해야합니다.


이 글에 대한 댓글이 총 13건 있습니다.

sqlite3에서 날짜간 차를 구하는 법을 몰라서 ㅋㅋ;

상기님 답을 거꾸로 더해줘 봤습니다~

 

macmini:~ nonun$ sqlite3 /tmp/test
SQLite version 3.3.6
Enter ".help" for instructions
sqlite> select date('1000-02-28', '+365184 day');
2000-01-01
sqlite>

신기배(소타)님이 2006-07-12 14:26에 작성한 댓글입니다.

Altibase MMDBMS 결과입니다.

 

iSQL>  select DATEDIFF ('01-JAN-2000','28-FEB-1000','DAY') from dual;
DATEDIFF ('01-JAN-2000','28-FEB-1000','D
-------------------------------------------
-365184
1 row selected.
iSQL>

 

iSQL> select DATEDIFF ('01-JAN-2000','28-FEB-1000','DAY') AS 날짜차이 From dual;
iSQL> /
날짜차이
-----------------------
-365184
1 row selected.
iSQL>
최한열(검은호랑이)님이 2006-07-12 14:55에 작성한 댓글입니다.
이 댓글은 2006-07-12 14:57에 마지막으로 수정되었습니다.

FB 1.5.3 / MySQL 3.23.58

 

둘다 365184 를 보입니다. Interbase 6.5 는 귀찮아하서 패쑤..하지만 동일한 값을 보일것입니다.

 

추측컨데, 일전의 테스트에서 다른값을 보였던 오라클과 큐브리드는 아마 저 값에서 -5 의 값 365179 가 나오지 않을까 하는군요...이유는 대충 짐작이 갑니다만...-,.ㅡ;;;

team b(teamb)님이 2006-07-12 14:58에 작성한 댓글입니다.
이 댓글은 2006-07-12 14:59에 마지막으로 수정되었습니다.

흠.. 깊이 생각해보진 않았는데

록화형 도대체 어떻게 계산한 것이야..

 

큐브리드 결과입니다.

select DATE '2000-01-01'-DATE '1000-02-28' from timet;

---

365179

이상호(search5)님이 2006-07-12 17:40에 작성한 댓글입니다.

우와 teamb님 초천재 -_-)=b

쿼리 날려보지도 않고 계산을 ㅋㅋㅋ

신기배(소타)님이 2006-07-12 17:45에 작성한 댓글입니다.

댓글을 달지 않을 수 없군요.

 

스고이네..

허정수(wertyu)님이 2006-07-12 18:17에 작성한 댓글입니다.

아마도 윤년 계산법에 의한 차이가 -5 나지 않을까 생각해봅니다.

이창민(Prosper)님이 2006-07-12 18:43에 작성한 댓글입니다.

밑의 게시글에 댓글을 달아놨습니다만....율리우스력 과 그레고리력의 상호 변환을 할때 날짜를 보정해줘야 합니다. (사라진 10일을 위해)

 

900년 3월이후 1000년 3월이전 의 보정일수는 5일 이더군요...

 

그래서 365179 를 떠올린것 입니다. 만약 그렇지 않고 365184 가 나왔다면...그야말로 믿지못할(??) DB 인셈이죠...1000년 2월이 29일까지 보여주면서 2월 28일 까지 보여주는 DB랑 같은 결과를 준다면...

 

개발자를 때려야 합니다. -0-

team b(teamb)님이 2006-07-12 19:55에 작성한 댓글입니다.

결론은 제가 질문을 잘못했군요. :)

 

현재 쓰고 있는 그레고리오 달력으로 2000년 1월 1일과, 그 당시 쓰고 있던 율리시즈 달력으로 1000년 2월 28일 사이에 해가 몇번 떠고졌는가?

 

이 질문이 제일 완벽한 질문이군요.

이 답이, 365179번이다는게지요?

 

그렇다면,

sql 구문이 좀 더 섬세해야할 것같네요.

 

select '2000-01-01'::gregoliandate - '1000-02-28'::juliandate

 

이런식으로 ^^

 

자, 그럼,

저런 달력 종류를 생략했다면,

공리적인 그 당시 사용되었던 달력으로 자동변환 되어는 것이 타당한가?

논리적으로 두 날짜의 달력형태를 일치시켜서 같은 자료형 연산으로 보는 것이 타당한가?

 

이것에 대한 문제가 되는군요.

 

환률의 문제와 비슷한 문제 같군요.

 

select 20달러 - 2000원?

 

이 질문과 비슷한 질문인디....

그렇다면, M$ 쪽 처럼 '난 계산 못한다' 가 가장 바람직한 처사인듯합니다.

 

윗 select 는 당연히 현재 환률로 변환하고 값을 구하는 것이 상식선이겠지만,

 

저 쿼리문에는 그 환률 적용시점이 포함되어있지 않으니, 계산할 수 없다가 더 타당할 듯싶네요. :)

 

꽤 재미나게 생각하게 했네요.

술이 다 깼음 :)

김상기(ioseph)님이 2006-07-13 02:07에 작성한 댓글입니다.
이 댓글은 2006-07-13 02:07에 마지막으로 수정되었습니다.

 

흠, 아무리 생각해봐도 어느게 맞다 틀리다 하지는 못하겟지만, 오라클과 큐브리드의 방식이 나은거 같습니다.

 

M$-SQL이나 Sybase 의 경우는...대책없는...흠 Sybase 가 무슨이유로 1753년부터 시작하는지가 더 궁금하네요...M$-SQL은 Sybase가 모태이니 그대로 따라간듯 싶고...

 

뭐 여튼 전 1000-02-29 이 있던 없던 365179 이던 365184 이던...관심 끄겟습니다. 머리만 아퍼여 -,.ㅡ;;;; (하지만 언제가 될지는 모르겟지만 다시 관심을 가질 계획은 있습니다. .orz..)

 

흠...누가 1753년 의 비밀을....좀 -,.ㅠ;;;

team b(teamb)님이 2006-07-13 13:17에 작성한 댓글입니다.

Sybase ASE입니다~~

 

datetime말고 date type이 있는질 몰랐습니다~~(무식)

1> select datediff(dd,convert(date,"20000101"),convert(date,"10000228"))
2> go

 -----------
     -365184

 

 

1753의 비밀은 현재 못풀었습니다~~...

 

하여간 저장은 17530101은 이렇게 저장되는군요.

 

FFFF 2e49

 

1900년을 기준으로...FFFF를 붙이고 날자를 계산해서..그냥하는것 보다 2btye가 작어서..

 

1753만 나오는게 아닐까 했는데.....

 

그게 아닌것 같더군요~~그렇가면 FFFF 0001이 제일 큰수인데~~~

 

 

하여간~~~열심히 연구는 하고 있는데....미리 푸신분은 알려주세요~~

지연님이 2006-07-14 14:41에 작성한 댓글입니다.
이 댓글은 2006-07-14 14:45에 마지막으로 수정되었습니다. Edit

달력쪽 얘기라 저도 댓글을 달지 않을 수 없군요.

 

좀 원록적인 얘기입니다만 ....

 

일단,

먼 과거나 미래의 시각(시간이 아님)에 대해서 언급하려면

소위 천체역학(?)에서 말하는 `율리우스 적일'이나 지구시(TT)를 사용해야 합니다.

 

달력이 천체의 운행을 다루는 역법이다 보니 어쩔 수 없는

오차(예를들어 dT)가 있기 마련입니다. 천체는 매우 규칙적으로

운행하는것처럼 보이지만 실제로는 매우 복잡한 오차가 있습니다.

(예를들어 지구-달의 장동 등등 ...)

 

 - UT(세계시) =  TT(지구시) - dT(텔타T, 관측에 의해서 정해짐)

 - KST = UT + 9H

 

원론적인 얘기는 접고...

 

 - 지구시 2000년 1월 1일은 J2000.000 => 2451545.0(JD 원년)

 - 지구시 1000년 2월 28일은 J1000.1807 => 2086361.0(JD)

 

입니다. JD는 율리우스 적일, 또는 줄리안데이를 의미합니다.

 

양 시각에 대한 차이는 365,184 JD 입니다.

 

만약 특정 DB가 이 값이 나오지 않는다면 아마 JD 로 계산하지

않은 알고리즘(?)을 택한것으로 사료됩니다.

 

참고로 지구시 1000년 2월 29일과 1000년 3월 1일의 JD가 같기 때문에

실제로 1000년 2월 29일은 없습니다.

 

김칠봉(san2)님이 2006-07-18 01:34에 작성한 댓글입니다.
이 댓글은 2006-07-18 01:41에 마지막으로 수정되었습니다.

아.. 역시.

 

이해는 잘 안 되지만 내용이지만, 칠봉형이 옛날에 스크립트 짜셨던 것이 기억나는군요.

 

허정수(wertyu)님이 2006-07-18 09:09에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
5252CUBRID 교육 감사히 잘 받았습니다. [1]
임명순
2006-07-15
6826
5251말레이지아로 잠시 떠나시는 명순님을 위해 급작번개를 소집합니다. [5]
이상호
2006-07-14
7137
5249???????? [1]
이창민
2006-07-13
6958
5248심심풀이 두번째 - 이젠 심심의 범위를 떠난 것 같지만. [13]
김상기
2006-07-12
8735
5247아놔.. 나 또 왜 이래 -_-;; 시디롬에 DVD 넣은 이야기 [4]
이상호
2006-07-12
6773
5246[질문] 오라클 관련 프로그램...
김홍식
2006-07-11
6834
5244심심풀이 [21]
김상기
2006-07-10
8129
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다