DataBase/MySQL 2019. 7. 9. 14:37
반응형

MySQL은 Oracle과 다르게 표준으로 제공하는 Julian 지원함수가 없음

 

줄리안 날짜(Julian Day or Julian Data)

[의미]
쥴리안 일자는 1583년에 조셉 스캘리저에 의해 발명된 방법으로 7,980년 동안 그 주기가 시작하는 날로부터 특정 일자까지 경과된 일수를 말한다. 
이러한 체계의 목적은 어떤 날짜와 다른 날짜간의 차이를 정수로 표현함으로써 계산하기 쉽게 하기 위한 것이다. 
7,980년이라는 주기는 몇 가지 전통적인 시간주기(태양, 달, 및 특별한 로마의 세금주기 등)를 조합하여 공통의 배수인 7,980이라는 숫자가 도출되었다. 
쥴리안 일자의 주기는 첫 번째 날짜는 기원전 4,713년 1월 1일이며, 서기 3,268년 1월 22일에 끝나도록 되어있다. 
그 이후의 날들은 두 번째 쥴리안 일자 기간(또는 또다시 시작될 7,890일 주기)의 첫날부터 시작될 것이다. 

1998년 2월 28일의 특정한 시간에 대한 쥴리안 일자는 다음과 같이 표현된다. 

2450873.172719 

여기서 2,450,873은 쥴리안 일자의 시작으로부터 그날까지 경과된 날수를 의미하며, ".172719"는 그날의 시간을 나타낸다. 
쥴리안 일자라는 명칭이 조셉 스캘리저의 아버지인 쥴리어스 캐사르 스캘리저 때문에 붙여진 것인지, 또는 율리우스력(Julian calendar) 이후에 붙여진 것인지는 확실치 않다. 
쥴리안 일자는 천문학에서 널리 사용된다. 

컴퓨터 프로그래밍에서 일반적으로 말하는 쥴리안 일자는, 특정한 연도의 시작으로부터 경과된 일수를 의미하는 것으로, 의미가 원래에 비해 와전되었다. 
예를 들어, 이러한 용례에서 1998년 2월 28일에 대한 쥴리안 일자는 "59"가 된다.

 

-- 테스트 시간 
SELECT NOW();
-- 결과: '2019-07-09 14:00:22'

--  DATE 타입 --> CHAR 타입 변경: Julian Day
SELECT TO_DAYS(NOW())+1721060;
-- 결과: '2458674'

--  CHAR 타입 변경: Julian Day --> DATE 타입
SELECT FROM_DAYS(2458674 -1721060);
-- 결과: '2019-07-09'

-- 8시간 빼기
SELECT DATE_SUB(NOW(), INTERVAL 8 HOUR);
-- '2019-07-09 06:12:41'

SELECT TO_DAYS(DATE_SUB(NOW(), INTERVAL 8 HOUR))+1721060;
-- 결과: '2458674'

SELECT MOD(TO_DAYS(DATE_SUB(NOW(), INTERVAL 8 HOUR))+1721060, 4);
-- 결과: 2

반응형
posted by choiwonwoo
:
DataBase/MySQL 2019. 7. 9. 14:34
반응형

-- 1) DATE 타입  
SELECT NOW() FROM DUAL; 
-- 결과: '2019-07-09 14:20:34'

-- 2) DATE 타입 --> CHAR 타입 변경 
SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%s') FROM DUAL; 
-- 결과: '20190709142515'

SELECT DATE_FORMAT(NOW(), '%m/%d/%Y %H:%i:%s') FROM DUAL; 
-- 결과: '07/09/2019 14:24:17'

-- 3) CHAR 타입 --> DATE 타입 변경  
SELECT STR_TO_DATE('20190709142515','%Y%m%d%H%i%s') FROM DUAL; 
-- 결과: '2019-07-09 14:25:15'

SELECT STR_TO_DATE('07/09/2019 14:24:17','%m/%d/%Y %H:%i:%s') FROM DUAL; 
-- 결과: '2019-07-09 14:24:17'


-- 4) 날짜/시간 연산 

---- a) 현재 시간 
SELECT NOW() FROM DUAL; 
-- 결과: '2019-07-09 14:29:51'

---- b) 하루 더하기  
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) FROM DUAL; 
-- 결과: '2019-07-10 14:30:10'

---- c) 한시간 더하기 
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY_HOUR) FROM DUAL; 
-- 결과: '2019-07-09 15:30:49'

---- d) 1분 더하기  
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY_MINUTE) FROM DUAL; 
-- 결과: '2019-07-09 14:32:40'

---- e) 1초 더하기  
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY_SECOND) FROM DUAL; 
-- 결과: '2019-07-09 14:32:09'

반응형
posted by choiwonwoo
:
DataBase/Oracle 2019. 7. 9. 14:19
반응형

줄리안 날짜(Julian Day or Julian Data)

[의미]
쥴리안 일자는 1583년에 조셉 스캘리저에 의해 발명된 방법으로 7,980년 동안 그 주기가 시작하는 날로부터 특정 일자까지 경과된 일수를 말한다. 
이러한 체계의 목적은 어떤 날짜와 다른 날짜간의 차이를 정수로 표현함으로써 계산하기 쉽게 하기 위한 것이다. 
7,980년이라는 주기는 몇 가지 전통적인 시간주기(태양, 달, 및 특별한 로마의 세금주기 등)를 조합하여 공통의 배수인 7,980이라는 숫자가 도출되었다. 
쥴리안 일자의 주기는 첫 번째 날짜는 기원전 4,713년 1월 1일이며, 서기 3,268년 1월 22일에 끝나도록 되어있다. 
그 이후의 날들은 두 번째 쥴리안 일자 기간(또는 또다시 시작될 7,890일 주기)의 첫날부터 시작될 것이다. 

1998년 2월 28일의 특정한 시간에 대한 쥴리안 일자는 다음과 같이 표현된다. 

2450873.172719 

여기서 2,450,873은 쥴리안 일자의 시작으로부터 그날까지 경과된 날수를 의미하며, ".172719"는 그날의 시간을 나타낸다. 
쥴리안 일자라는 명칭이 조셉 스캘리저의 아버지인 쥴리어스 캐사르 스캘리저 때문에 붙여진 것인지, 또는 율리우스력(Julian calendar) 이후에 붙여진 것인지는 확실치 않다. 
쥴리안 일자는 천문학에서 널리 사용된다. 

컴퓨터 프로그래밍에서 일반적으로 말하는 쥴리안 일자는, 특정한 연도의 시작으로부터 경과된 일수를 의미하는 것으로, 의미가 원래에 비해 와전되었다. 
예를 들어, 이러한 용례에서 1998년 2월 28일에 대한 쥴리안 일자는 "59"가 된다.

 

[SQL]

-- 테스트 시간 
SELECT SYSDATE FROM DUAL;
-- 결과: 09.07.2019 12:12:45

-- DATE 타입 --> CHAR 타입 변경: Julian Day
SELECT TO_CHAR(SYSDATE,'J') FROM DUAL;  
-- 결과: 2458674 

-- 8시간 빼기
SELECT SYSDATE-8/24 FROM DUAL;
-- 결과: 09.07.2019 05:57:17

SELECT TO_CHAR(SYSDATE-8/24,'J') FROM DUAL;
-- 결과: 2458674

SELECT Mod(TO_CHAR(SYSDATE-8/24,'J'),4) FROM DUAL;
-- 결과: 2

반응형
posted by choiwonwoo
:
DataBase/Oracle 2019. 7. 9. 11:56
반응형

-- 1) DATE 타입 
SELECT SYSDATE FROM DUAL;
-- 결과: 09.07.2019 08:50:46

-- 2) DATE 타입 --> CHAR 타입 변경
SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') FROM DUAL;
-- 결과: 20190709085255

SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY HH24:MI:SS') FROM DUAL;
-- 결과: 07/09/2019 08:53:52

-- 3) CHAR 타입 --> DATE 타입 변경 
SELECT TO_DATE('20190709085255','YYYYMMDDHH24MISS') FROM DUAL;
-- 결과: 09.07.2019 08:52:55

SELECT TO_DATE('07/09/2019 08:53:52','MM/DD/YYYY HH24:MI:SS') FROM DUAL;
-- 결과: 09.07.2019 08:53:52

-- 4) 날짜/시간 연산

---- a) 현재 시간
SELECT SYSDATE FROM DUAL;

---- b) 하루 더하기 
SELECT SYSDATE + 1 FROM DUAL;

---- c) 한시간 더하기
SELECT SYSDATE + 1/24 FROM DUAL;

---- d) 1분 더하기 
SELECT SYSDATE + 1/(24*60) FROM DUAL;

---- e) 1초 더하기 
SELECT SYSDATE + 1/(24*60*60) FROM DUAL;

반응형
posted by choiwonwoo
:
DataBase/TIP 2008. 1. 9. 13:41
반응형
1.사용법

--Usage:
select dbo.udf_CheckFileSize (''c:\choiwonwoo.txt'')
select dbo.udf_CheckFileSize (''d:\sqldumps\msdbx.bak'')
select dbo.udf_CheckFileSize (''x:\sqldumpsmsd.bak'')

--Results
145920 bytes
23092736 bytes
-1 means File not found or path not found
-2 error during FSO process


2. script
Create function udf_CheckFileSize (@filename varchar(1000))
returns bigint
as
--Created by : MAK
--Date: Dec 5, 2004
--Objective: To display the size of the given file
BEGIN
DECLARE @FS int
DECLARE  @OLEResult int
DECLARE  @FileID int
DECLARE @Size bigint
DECLARE @Flag bigint
set @size =0
set @Flag =0
EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
EXECUTE @OLEResult = sp_OAMethod @FS, 'GetFile', @FileID OUT,@filename
IF @OLEResult <> 0  
begin
set @Flag =-1
end
else
begin
EXECUTE @OLEResult = sp_OAGetProperty @FileId,'Size', @Size OUT
IF @OLEResult <> 0  
begin
set @Flag =-2
end
end

EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS
if @flag <> -1 and @flag <> -2 
begin 
set @flag = @size
end
return @flag
END

반응형
posted by choiwonwoo
:
DataBase/Advance 2008. 1. 2. 16:52
반응형

“equal to 연산의 데이터 정렬 충돌을 해결할 수 없습니다” 라는 오류 해결.

보통 조인되는 두 컬럼의 정렬이 틀리게 되어 있어 나타는 현상이다.

정렬 형식은 sp_help 테이블명 하면 collation 항목에 나타난다.

이럴때는 EM의 테이블 디자인에서나 Alter Table 구문으로 정렬 형식을 맞춰 주면 된다.

Alter table tbMembers
Alter column hakbun varchar(8) collate Korean_Wansung_CI_AS


cheers

반응형
posted by choiwonwoo
:
DataBase/Query 2007. 12. 27. 14:50
반응형
다음의 예를 보자

1) where name like 'choi%'

2) where name like '%choi'

3) where substring(name,1,3) = 'choi'


(결과)
모두 결과는 같다.
그러나 성능에 차이가 난다.

1번예는 인덱스를 탄다.

2번예는 인덱스를 타지 않는다.

3번예는 인덱스를 타지 않는다.

==> 원칙적으로 lvalue즉 colum에는 절대로 변형을 가하지 말라.
반응형
posted by choiwonwoo
:
DataBase/Query 2007. 12. 27. 14:22
반응형

EXISTS 및 NOT EXISTS로 시작하는 하위 쿼리는 교집합과 차집합이라는 두 집합 이론 작업에 사용할 수 있습니다. 두 집합의 교집합은 두 가지 원래 집합에 모두 속하는 요소를 포함하고, 차집합은 두 집합 중 첫 번째 집합에만 속하는 요소를 포함합니다.

city 열에 대해 authorspublishers 의 교집합은 저자와 출판사가 모두 있는 도시의 집합입니다.

USE pubs
SELECT DISTINCT city
FROM authors
WHERE EXISTS
   (SELECT *
   FROM publishers
   WHERE authors.city = publishers.city)

결과 집합은 다음과 같습니다.

city
--------
Berkeley

(1  적용됨)

단순 조인을 사용하여 작성할 수도 있습니다.

USE pubs
SELECT DISTINCT authors.city
FROM authors INNER JOIN publishers
ON authors.city = publishers.city

city 열에 대해 authorspublishers 의 차집합은 저자가 거주하지만 출판사는 없는 도시의 집합으로서 Berkeley를 제외한 모든 도시가 됩니다.

USE pubs
SELECT DISTINCT city
FROM authors
WHERE NOT EXISTS
   (SELECT *
   FROM publishers
   WHERE authors.city = publishers.city)

위의 쿼리는 다음과 같이 작성할 수도 있습니다.

USE pubs
SELECT DISTINCT city
FROM authors
WHERE city NOT IN
   (SELECT city 
   FROM publishers)
반응형
posted by choiwonwoo
:
DataBase/Query 2007. 12. 27. 13:48
반응형

Sub Query를 작성하다보면 이런 에러 메시지를 만나게 되는 경우가 있다.

(sample )
SELECT E.DateBegin, E.DateEnd
FROM dbo.[Event] AS E
WHERE E.EventID =( SELECT ESF.EventID
     FROM DBO.STAFF AS SF,dbo.EventStaff AS ESF
     WHERE SF.staffid = ESF.staffid )

(error)
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

==> 위의 subquery에서 값을 비교하므로 rvalue자체가 스칼라 값이어야만 한다. 그런데 위의 rvalue는 scalar값이 아니다. 이런 경우는 아래와 같이 하면 된다.

(solution)
SELECT E.DateBegin, E.DateEnd
FROM dbo.[Event] AS E
WHERE E.EventID IN ( SELECT ESF.EventID
     FROM DBO.STAFF AS SF,dbo.EventStaff AS ESF
     WHERE SF.staffid = ESF.staffid )


반응형
posted by choiwonwoo
:
DataBase/Advance 2007. 12. 18. 12:12
반응형

=========================================================================================

A-SQLServer SQL Server에 존재하는 Migrate 데이터베이스를 B-SQLServer SQL Server로 동일한 데이터베이스명으로 이관하고 사용자(MigDBUser)가 접근 할 수 있도록 권한 처리를 한다.

   

  • 이관하려는 데이터베이스를 백업
    • 데이터베이스 백업
      • Microsoft SQL Server Management Studio 실행
      • A-SQLServer 서버에 연결한다.
      • Migrate 데이터베이스를 좌측 개체 탐색기에서 선택 후 우측 마우스 버튼 클릭
      • [작업] - [백업] 선택
      • 데이터베이스 백업 대화상자가 열린다.
      • [일반] 페이지 - [대상] Section 의 추가, 제거 버튼을 클릭하여 백업할 위치지정 (파일명 예: Migrate.bak)
      • [확인] 버튼을 클릭

           

  • 백업 데이터베이스 확인
    • Migrate.bak 파일이 생성되었는지 확인한다.

         

  • B-SQLServer 서버에 데이터베이스 이관
    • Migrate.bak 파일을 이관 B-SQLServer가 존재하는 PC 로컬 디스크에 복사 한다
    • Microsoft SQL Server Management Studio에서 B-SQLServer 서버 연결
    • 좌측 개체 탐색기에 존재하는 DB중 아무거나 선택하고 우측 마우스 버튼을 클릭
    • [작업] - [복원] - [데이터베이스]를 선택
    • 데이터베이스 복원 대화상자가 열린다.
    • [일반] 페이지 - [복원에 사용할 원본] Section의 라디오 버튼 중(데이터베이스, 장치) 장치를 선택하고 우측의 버튼을 클릭한다.
    • 백업 지정 대화상자가 열린다.
    • 백업 위치 영역 우측의 버튼 중 "추가"(맨 위) 버튼을 클릭한다.
    • Migrate.bak 파일을 찾아 선택하고 확인 버튼을 클릭한다.
    • 백업 지정 대화상자의 확인 버튼을 클릭하여 지정을 완료한다.
    • 장치 지정이 이뤄지면 복원에 사용할 백업 세트 선택 영역에 복원 대상 목록이 표현된다.
    • 최근 버전에 해당하는 데이터베이스 좌측의 체크박스를 선택한다.
    • [일반]페이지 - [복원 대상] Section의 데이터베이스를 Migrate (생성하려는 데이터베이스명)로 지정한다.
    • [옵션]페이지 - [복원 옵션] Section의 데이터베이스 복원 위치를 지정한다.
      • Mdf(데이터베이스 파일), ldf(로그 파일) 의 위치 및 파일명을 선택한다.
    • 이전에 존재하는 데이터베이스 일 경우, [옵션] 페이지 - [복원 옵션] Section의 최상위 체크 박스인 기존 데이터베이스 덮어쓰기를 선택한다.
    • 위의 설정을 수행하고 확인 버튼을 클릭한다.
    • 데이터베이스의 용량에 따라 수초에서 수분이 걸릴 수 있다.
    • 작업이 완료되면 생성되었다는 메시지가 뜬다.

         

  • 권한 설정 (삭제)
    • 이관한 데이터베이스는 시스템이 틀리므로 이름이 동일하더라도 내부적으로 가지고 있는 SID값이 틀려 프로그램으로 접근이 불가능 하다.
      • SELECT * FROM maste..syslogins, SELECT * From Migrate..sysusers
      • 위의 쿼리를 입력하면 틀린 SID값을 확인할 수 있다.
    • 먼저 이관한 데이터베이스의 전체 권한을 제거한다.
      • 권한 제거는 다른 UI에서 처리할 수가 없으며, 쿼리를 수행하여 삭제할 수 있다.
        • sp_dropuser 'MigDBUser'
    • 좌측 개체 탐색기에서 이관한 데이터베이스를 선택하고 우측 마우스 버튼을 클릭한다.
    • [속성]을 선택한다.
    • 데이터베이스 속성대화상자가 열린다.
    • [사용 권한] 페이지 선택을 클릭한다.
    • [사용자 또는 역할] 영역에 MigDBUser가 삭제되었는지 확인하고, 기타 다른 계정도 2) 항목과 같이 삭제 처리한다.

         

  • 권한 설정 (추가)
    • 좌측 개체 탐색기에서 [보안] - [로그인]을 선택하고 우측 마우스 버튼을 클릭한다.
    • [새 로그인]을 선택한다.
    • 로그인 - 신규 대화상자가 열린다.
    • [일반] 페이지 선택을 클릭하고 로그인 이름에 MigDBUser를 입력한다.
    • SQL Server 인증으로 체크하고 암호를 입력한다.
    • 암호 정책 강제 적용 등 옵션을 선택하고 기본 데이터베이스(Migrate)를 지정, 기본 언어 선택을 한다
    • [사용자 매핑] 페이지 선택을 클릭하고 우측에 접근할 데이터베이스 체크한다.
    • [데이터베이스 역할 맴버 자격] Section에서 db_datareader, db_owner등 권한에 맞도록 체크를 한다.
    • [확인] 버튼을 클릭하여 계정 생성을 완료한다.
      =========================================================================================


      MSSQL2000 에서 백업 받은 DB를 다른 서버에 있는 MSSQL2000 에 복원 시켰을때 해당 DB의 사용자가 있는데 로그인 이름이 없어 로그인이 안되는 문제가 있다.

      이 문제는 해당 DB를 사용하는 사용자의 GUID가 syslogins.sid 테이블에 있는 것돠 다르기때문이다.

      EM에서 사용자에 가 보면 사용자 이름은 있는데 로그인 이름은 비어 있을 것이다.이것을 해결하기 위해서는 새 서버의 로그인 계정과 복원한 DB의 사용자 를 연결해야 한다.

      먼저 쿼리매니저에서 연결되지 않은 계정을 확인한다.

      sp_change_users_login 'Report'
      go;

      하면 사용자는 있는데 연결되지 않은 사용자의 아이디가 나온다.

      나오는 이름을 확인하고

      sp_change_users_login 'Update_one', 'username', 'username'

      go;

      를 하면 연결 작업이 끝난다. EM에서 사용자를 보면 로그인 이름이 생겨있다.


      이제 DB에 해당 사용자로 연결이 되는지 확인하면 된다.

      http://www.baragi.pe.kr/

반응형
posted by choiwonwoo
: