SQL++/N1QL 쿼리

오라클 날짜 형식: N1QL 및 날짜-시간 함수 지원

날짜 및 시간 함수와 형식은 데이터베이스마다 다를 수 있습니다. 이 글에서는 Couchbase ISO 기반 날짜-시간 함수와 Oracle 날짜 형식을 비교하겠습니다. 날짜 형식은 NoSQL JSON 형식의 특성으로 인해 관계형 데이터베이스와 NoSQL 데이터베이스마다 다릅니다. 자세히 알아보기 이 웹캐스트에서 를 통해 SQL 지식을 희생하지 않으면서도 NoSQL 데이터베이스 쿼리의 유연성 유지.

오라클 날짜/시간 유형

오라클에서는 날짜 형식과 시간대 기능에는 다음과 같은 여러 데이터 유형이 포함됩니다: 날짜, 타임스탬프, 시간대가 포함된 타임스탬프 그리고 현지 시간대가 포함된 타임스탬프. . 타임스탬프 데이터 유형은 날짜 유형입니다.

Oracle의 날짜 형식은 다음과 같이 표현할 수 있습니다. 리터럴 또는 숫자 값을 반환합니다. 리터럴은 지정된 형식이어야 합니다. 날짜-시간의 형식은 다음을 사용하여 설정할 수 있습니다. nls_date_format, nls_timestamp_format, NL_TIMESTAMP_TZ_FORMATnls_date_language 매개변수를 사용할 수 있습니다. 아래 표에는 작업 예시와 함께 자세한 비교 내용이 나와 있습니다.

카우치베이스 날짜 형식

카우치베이스에서는 날짜-시간이 조금 다르게 처리됩니다. 모든 날짜와 시간은 다음과 같이 저장되어야 합니다. 문자열 를 따르는 확장된 ISO 8601 날짜 시간 형식. N1QL에는 다음이 포함됩니다. 날짜 시간 함수를 사용하여 이러한 오라클 날짜 형식의 문자열을 추출할 수 있습니다. 그리고 날짜 그리고 시간 를 밀리초 단위의 유닉스 타임스탬프로 표시할 수도 있습니다.

이는 기본적으로 입력 날짜 및 시간의 형식이 입력 날짜 및 시간의 값에 따라 변경될 수 있는 Oracle과 달리 nls_date_format 그리고 nls_timestamp_format의 날짜 형식은 엄격한 집합을 따릅니다. 

예를 들어 오라클 타임스탬프 형식입니다:

'2008-dec-25 17:30' 는 유효한 날짜이며 nls_date_format='yyyy-mon-dd hh24:mi'

그러나 Couchbase에서 동일한 값을 표현하려면 사용자는 주어진 값 중 하나를 사용해야 합니다. 날짜 함수 형식.

예를 들어, 2008-12-25 17:30:00

시간 정밀도

오라클에서, fractional_seconds_precision 는 선택 사항이며 분수 부분의 자릿수를 지정합니다. SECOND 날짜/시간 필드를 입력합니다. 숫자(0~9)로 입력할 수 있으며 기본값은 6입니다.

예를 들어 Oracle에서 날짜-시간 형식은 다음과 같이 지정할 수 있습니다:

타임스탬프 'yyyy-mm-dd hh24:mi:ss.fff'

이를 사용하여 타임스탬프를 정의할 수 있습니다: ‘2006-01-02 15:04:05.999’

카우치베이스 N1QL 는 오라클과 유사한 분수 초를 지원합니다. 이는 형식을 사용할 때 표시됩니다: “2006-01-02T15:04:05.999”. 하지만, N1QL은 3자리 정밀도(나노초 정밀도)를 지원하며 Oracle은 최대 9자리 소수점 초 정밀도를 지원합니다.

즉, 날짜를 지정하면: “2006-01-02T15:04:05.999123456”를 입력하면 N1QL이 3자리로 반올림되어 반환됩니다: “2006-01-02T15:04:05.999”.

N1QL의 경우,

Oracle의 경우,

N1QL을 사용하여 9자리 이상의 숫자를 지정하면 날짜-시간 함수는 null을 반환합니다.

Oracle 날짜-시간 형식의 경우 소수 초 부분에 9자리 이상의 숫자를 입력하면 오류가 발생합니다: ORA-01830: 전체 입력 문자열을 변환하기 전에 날짜 형식 그림이 끝남

오라클과 카우치베이스의 날짜/시간 접근 방식 비교

다음 표에 Couchbase N1QL과 Oracle의 날짜/시간 지원 비교가 나와 있습니다:

Oracle 날짜 및 시간 데이터 유형 카우치베이스 날짜 시간 형식 지원
날짜 데이터 유형 F에 의해 정의됩니다:

nls_date_format

nls_date_language

예시:

그리고 nls_date_format 매개 변수를 설정해야 합니다. 를 초기화 매개변수 파일에 추가합니다:

nls_date_format='yyyy-mon-dd'

샘플 날짜:

날짜 '2008-dec-25'

설정하려면 nls_date_language 매개변수 를 사용할 수 있습니다. 세션 변경 문을 사용합니다.

 

N1QL에서는 특정 날짜/시간/타임스탬프 데이터 유형입니다. 모두 ISO 8601 확장 형식의 JSON 문자열로 표시되며 날짜 시간 조작 및 산술 함수를 사용하여 조작됩니다.

참조 문서 를 클릭해 전체 목록을 확인하세요.

허용되는 날짜 형식*:

YYYY-MM-DD

예시:

Couchbase/N1QL에서 날짜는 일, 월, 연도의 숫자 형식이 포함된 특정 형식으로 표시되어야 합니다.

입력 형식과 일치하지 않는 모든 날짜의 경우 기본 형식의 입력 날짜를 반환합니다:

YYYY-MM-DDThh:mm:ss.sTZD

사용 날짜_포맷_str 함수를 사용하여 날짜 형식을 YYYY-MM-DD'YYYY-MON-DD' 

카우치베이스는 다음만 지원합니다. ISO 확장 날짜 형식. 여러 언어로 된 숫자가 아닌 날짜는 지원하지 않습니다.

타임스탬프 데이터 유형 F에 의해 정의됩니다:

nls_timestamp_format

다음 값을 지정할 수 있습니다. nls_timestamp_format 초기화 매개변수 파일에서 설정하면 됩니다.

nls_timestamp_format = 'yyyy-mm-dd hh:mi:ss.ff'

우리는 TO_TIMESTAMP 함수를 사용하여 입력을 변환합니다. 날짜-시간타임스탬프 데이터 유형.

 

date와 함수는 동일하지만 입력 날짜 형식 입력 인수가 다릅니다. 이 인수는 명시적으로 제공해야 합니다. 

타임스탬프 구성 요소와 함께 날짜 형식입니다:

YYYY-MM-DD hh:mm:ss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DD hh:mm:ss.s
YYYY-MM-DDThh:mm:ss.s

시간 기반 형식:

hh:mm:ss
Hh:mm:ss.s

카우치베이스는 나노초 단위의 정밀도를 지원합니다.

데이터 유형:

시간대가 포함된 타임스탬프
현지 시간대가 포함된 타임스탬프

에 의해 정의된 형식입니다:

NL_TIMESTAMP_TZ_FORMAT

다음 값을 지정할 수 있습니다. NL_TIMESTAMP_TZ_FORMAT 초기화 매개변수 파일에서 설정하면 됩니다:

nls_timestamp_tz_format = 'yyyy-mm-dd hh:mi:ss.ff tzh:tzm'

우리는 to_timestamp_tz 함수를 사용하여 입력 날짜/시간을 시간대 데이터 유형이 있는 타임스탬프로 변환합니다. 입력된 표준 시간대를 유지합니다.

 

형식의 날짜/시간 구성 요소를 포함합니다:

YYYY-MM-DDThh:mm:ssTZD
YYYY-MM-DD hh:mm:ssTZD
YYYY-MM-DDThh:mm:ss.sTZD
YYYY-MM-DD hh:mm:ss.sTZD

타임스탬프 기반 형식:

hh:mm:ss.sTZD
hh:mm:ssTZD

N1QL에는 특정 형식 외에도 다음과 같은 특정 시간대 기능도 있습니다. 문자열을 시간대로 STR_TO_TZ 입력 날짜를 지정된 시간대로 변환합니다. 표준 시간대 조작 기능에 대한 설명서를 참조하세요.

표 1 - 오라클 날짜/시간 유형과 N1QL ISO 표준 시간대 및 날짜 형식 비교

* 오라클과 N1QL 모두 지정된 시간대에 서머타임이 적용되고 있는지 여부를 자동으로 결정하고 해당 현지 시간을 반환합니다.  

** N1QL에서 날짜 형식을 다룰 때는 날짜 시간 문자열의 각 구성 요소가 유효한 숫자 값을 사용해야 합니다. 또한 날짜/시간 문자열의 날짜 구성 요소는 대시 "", 시간 구성 요소는 콜론으로 구분해야 함 ":". 그렇지 않으면 유효한 날짜 객체가 아닙니다.


Moving from relational to NoSQL: How to get started from Oracle관련 리소스

JSON의 장점은 날짜/시간 정보를 저장하는 데 다양하고 유연한 스타일을 사용할 수 있고, 간단한 함수를 사용해 필요한 시점에 필요한 정보를 구성하거나 추출할 수 있다는 점입니다. Couchbase NoSQL에서는 엄격한 스키마가 필요하지 않으므로 레거시 RDBMS 솔루션보다 유연합니다. 백서를 읽고 자세히 알아보기.

 


오라클 및 카우치베이스 날짜/시간 구성 요소

모든 날짜/시간 유형에 대해 Oracle과 N1QL은 입력 날짜에 대해 서로 다른 필드에 추가 정보를 저장합니다. 이를 통해 사용자는 날짜에 대한 특정 정보를 추출할 수 있습니다.

오라클의 날짜/시간 필드는 다음과 같습니다. CENTURY, 연도, , DAY, 시간, MINUTE 그리고 SECOND. . 타임스탬프 데이터 유형은 초를 분수 초로 나타내며, 그 정밀도는 fractional_seconds_precision 매개변수. 또한 다음과 같은 필드도 포함됩니다. 시간대_시간, 시간대_분, 시간대_지역 그리고 TIMEZONE_ABBR. 내부적으로 오라클 타임스탬프를 날짜 값으로 변환합니다. 시간 구성 요소의 기본값은 자정이고 날짜 구성 요소의 기본 날짜는 현재 달의 첫날입니다. A 날짜 데이터 유형은 날짜와 시간 정보를 모두 저장합니다.

오라클이 지원하는 필드 외에도 날짜 그리고 시간 데이터 유형, N1QL은 다음을 지원합니다. 밀레니엄, DECADE, 분기, WEEK 그리고 밀리초. 이러한 필드의 값은 기본 산술을 사용하여 내부적으로 계산됩니다. N1QL은 다음을 지원하지 않습니다. 시간대_지역 그리고 TIMEZONE_ABBR 필드.

각 필드에 대한 자세한 비교는 아래 표에 나와 있습니다.

오라클의 타임스탬프 형식 예제에 대한 다음 샘플 행을 고려해 보겠습니다:

라는 이름의 버킷에 있는 해당 Couchbase 문서를 고려해 보겠습니다. bucket1:

그리고 TO_CHAR('CC' ), 를 첫 번째 인수로 사용하고 발췌 함수는 오라클에서 날짜-시간 필드 값을 검색하는 데 사용됩니다.

N1QL의 경우 두 가지 기능이 있습니다. DATE_PART_STR 또는 날짜_파트_밀리스 날짜가 JSON 문자열로 표시되는지 또는 숫자 밀리초로 표시되는지에 따라 다릅니다. 이러한 함수를 사용하여 아래 나열된 각 날짜-시간 구성 요소에 대한 예제를 제공합니다.

오라클 및 카우치베이스의 모든 날짜 시간 구성 요소 요약

날짜-시간 구성 요소 Oracle N1QL
CENTURY

 

연도

 



 

DAY

 

시간

(다른 동작)

오라클은 입력 타임스탬프의 표준 시간대 구성 요소를 고려합니다.

그리고 차이 가 결과에 표시되는 이유는 N1QL이 입력 타임스탬프의 표준 시간대 구성 요소를 고려하지 않기 때문입니다.

MINUTE

 

SECOND

 

분수 부분은 밀리초를 참조하세요.

시간대_시간

 

시간대_분

 

시간대_지역

 

TIMEZONE_ABBR

 

표준 시간대(UTC에서 오프셋) (필드가 아닌 데이터 유형 자체)

여기서 숫자는 시간대(초)를 나타냅니다.

밀레니엄

밀레니엄 = (연도/1000) + 1  

DECADE

10년 = 년 / 10

분기

분기 = (월 + 2) / 3

WEEK

= int(math.Ceil(float64(YearDay) / 7.0))

YearDay 는 윤년이 아닌 경우 1~365, 윤년인 경우 1~366 범위에서 시간으로 지정된 연도의 날짜를 반환합니다. (참조 골랑 타임 패키지)

밀리초

밀리초 = 나노초 / 106
를 정수로

ISO_YEAR

Iso_year = 입력 타임스탬프의 ISO 8601 연도입니다.

ISO_WEEK

Iso_week = 입력 타임스탬프의 ISO 8601 주입니다.

주 범위는 보통 1에서 53까지입니다. 예를 들어 n년도의 1월 1일부터 1월 3일까지는 n-1년도의 52주차 또는 53주차에 속할 수 있으며, 12월 29일부터 31일까지는 n+1년도의 1주차에 속할 수 있습니다.

DAY_OF_YEAR(DOY)

Day_of_year 또는 doy = YearDay

참조 골랑 타임 패키지.

YearDay 는 윤년이 아닌 경우 1~365, 윤년인 경우 1~366 범위에서 시간으로 지정된 연도의 날짜를 반환합니다.

요일_요일(다우)

요일_요일 또는 다우 = 평일 함수를 호출하면 주어진 시간 동안의 요일을 반환합니다. 참조 골랑 타임 패키지.

 

표준 시간대 고려 사항

N1QL의 경우 날짜 시간 형식 내입니다, 시간대_지역 그리고 TIMEZONE_ABBR 는 지원되지 않습니다. 하지만 시간대별 N1QL 기능.

위에서 살펴본 바와 같이 타임스탬프 날짜 내에서 지원되는 추가 필드가 있습니다. 다음과 같습니다. ISO_YEAR, ISO_WEEK, DAY_OF_YEAR (DOY), DAY_OF_WEEK (DOW) 및 시간대 는 UTC로부터의 오프셋입니다.

표준 시간대 표시기가 없는 경우 현재 현지 표준 시간대는 Couchbase 서버가 위치한 곳에서 가져옵니다.

좀 더 자세히 살펴보겠습니다. 시간대 N1QL과 Oracle을 비교합니다. 그리고 타임스탬프 시간대 포함 그리고 현지 시간대가 포함된 타임스탬프 오라클의 데이터 유형은 타임스탬프 데이터 유형입니다. 전자는 UTC 또는 시간대 지역 이름에 대한 상대적인 시간인 시간대 오프셋인 시간대 정보를 값에 포함하고, 후자는 현재 세션 시간대를 포함합니다. 현지 시간대가 포함된 타임스탬프 는 내부적으로 표준 시간대 정보를 저장하지 않지만, SQL 출력에서 현지 표준 시간대 정보를 볼 수 있습니다. TZH:TZM 또는 TZR TZD 형식 요소가 지정됩니다. Oracle 설명서를 참조하십시오: 날짜 시간 데이터 유형 및 시간대 지원 에서 자세한 내용을 확인하세요.

Oracle:  타임스탬프 '2017-01-31 03:49:30.612 -08:00'

카우치베이스: “2017-01-31T03:49:30.612-08:00”

Oracle의 경우 비교 대상인 두 날짜가 UTC로 동일한 값을 나타내면 두 날짜는 동일합니다:

타임스탬프 '2017-01-15 8:00:00 -8:00' == 타임스탬프 '2017-01-15 10:00:00 -6:00'

N1QL에서는 전체 날짜 값을 비교하려면 밀리초로 변환해야 합니다.

STR_TO_MILLIS(“2017-01-31T05:49:30.612-06:00”) == STR_TO_MILLIS(“2017-01-31T03:49:30.612-08:00”)  

가치: 1485863370612

오라클에서는 이 오프셋을 다음과 같이 대체할 수 있습니다. 시간대 지역 (TZR) 및 약어. 지역 값이 모호한 경우(미국이 서머타임으로 전환하는 경우)에는 약어(TZD)가 사용됩니다.

그러나 N1QL에서 날짜의 표준 시간대 구성 요소는 항상 UTC 오프셋으로 표시됩니다.

예를 들어

타임스탬프 '2017-01-15 8:00:00 -8:00'

가 될 수도 있습니다:

타임스탬프 '2017-01-15 8:00:00 미국/태평양 표준시'

Oracle은 간격 데이터 유형도 지원합니다. 년에서 월까지의 간격 그리고 하루 간격에서 초 간격. 이들은 시간 기간을 저장합니다. 전자는 연도 및 월 필드를 사용하여 기간을 저장하고 후자는 일, 시간, 분 및 초 필드를 사용하여 기간을 저장합니다. N1QL을 사용하면 날짜 시간 함수와 '부분' 구성 요소를 사용하여 간격을 쉽게 계산할 수 있습니다.

Oracle에 날짜 또는 시간 데이터를 삽입하는 방법에는 여러 가지가 있습니다. 사용자는 NLS 형식 값을 기반으로 형식이 지정된 문자열을 삽입하거나, 명시적으로 변환된 리터럴을 사용하여 TO_DATE / TO_TIMESTAMP 또는 to_timestamp_tz 함수 또는 암시적 변환을 사용합니다.

N1QL에서는 모든 날짜가 위에 지정된 형식의 문자열 또는 밀리초 단위의 유닉스 타임스탬프를 나타내는 숫자로 문서에 추가됩니다. 함수가 사용자에게 필요한 모든 연산을 수행하므로 날짜를 매우 쉽고 유연하게 처리할 수 있습니다. 하지만 한 가지 단점은 날짜가 날짜 형식 표의 형식 중 하나와 정확히 일치해야 한다는 것입니다. 따라서 사용자는 사용 가능한 형식의 하위 집합만 사용하도록 제한됩니다.

N1QL의 이 제한에 대한 한 가지 해결 방법은 문자열 함수를 사용하여 입력 날짜를 원하는 형식에 맞게 변경하는 것입니다. 예를 들어

2016-09-23T18:48:11.000+00:00을 "YYYY/MM/DD"로 변환하기

보시다시피, N1QL은 날짜 및 타임스탬프를 문자열이나 숫자로 표현하여 오라클 날짜-타임스탬프 형식과 비교했을 때 조작을 단순화합니다. 그러나 이는 사용자가 지정된 날짜 시간 형식만 사용하도록 제한되고 이러한 형식을 자유롭게 조작할 수 없다는 것을 의미하며, 오라클은 형식 매개변수를 사용하여 매우 쉽게 이러한 형식을 조작할 수 있습니다.

계속 학습하기

Couchbase SQL++ 언어로 JSON 문서를 쿼리해 볼 준비가 되셨나요?

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 카우치베이스 제품 마케팅

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.