now ()와 current_timestamp의 차이점


45

PostgreSQL에서는 now()and current_timestamp함수를 사용하지만 아무런 차이가 없습니다.

# SELECT now(), current_timestamp;
              now               |              now               
--------------------------------+--------------------------------
 04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)

뭔가 빠졌습니까?

답변:


54

다른 점이 없다. 매뉴얼에서 인용 한 3 개의 인용문 :

1)

이 SQL 표준 함수는 모두 현재 트랜잭션의 시작 시간에 따라 값을 리턴합니다.
... ...
CURRENT_TIMESTAMP

2)

transaction_timestamp()는에 해당 CURRENT_TIMESTAMP하지만 반환되는 내용을 명확하게 반영하도록 이름이 지정됩니다.

삼)

now()에 해당하는 기존 PostgreSQL transaction_timestamp()입니다.

대담한 강조 광산. CURRENT_TIMESTAMP, transaction_timestamp()now()이렇게 정확히 같은. CURRENT_TIMESTAMP뒤에 괄호 쌍이없는 함수의 구문 상 홀수입니다. 그것은 SQL 표준에 따릅니다.

SQL 문에서 함수 호출에 대한 열 별명을 선언하지 않으면 별명이 기본값으로 함수 이름입니다. 내부적으로 표준 SQL CURRENT_TIMESTAMP은로 구현됩니다 now(). 결과 열 이름 에 "현재"이지만 Postgres 10에서 "current_timestamp"로 변경된 Postgres 9.6까지 .

transaction_timestamp() 동일한 Postgres 함수이므로 기본 별칭은 항상 "transaction_timestamp"입니다.

마십시오 하지 중 이들의 혼동 기능 특수로 입력 상수'now' . 이는 특정 날짜 / 시간 / 타임 스탬프 값에 대한 몇 가지 표기법 속기 중 하나이며 설명서를 인용합니다.

... 읽을 때 일반 날짜 / 시간 값으로 변환됩니다. (특히 now관련 문자열은 읽 자마자 특정 시간 값으로 변환됩니다.) 이러한 모든 값은 SQL 명령에서 상수로 사용될 때 작은 따옴표로 묶어야합니다.

혼란을 가중시킬 수 있습니다 (최소한 Postgres 12까지). 많은 선행 및 후행 공백과 괄호 ( {[( )]})가 이러한 특수 입력 값에서 잘립니다. 따라서 'now()'::timestamptz또는 'now()'명시 적 유형 캐스트가 필요하지 않은 경우에도 유효하며 now() 대부분의 컨텍스트 에서 함수와 동일한 타임 스탬프로 평가 됩니다 . 그러나 이들은 상수 이며 일반적 으로 열 기본값으로 원하는 것이 아닙니다 .

db <> fiddle here
이전 SQL 바이올린

주목할만한 대안은 statement_timestamp()clock_timestamp()입니다. 매뉴얼 :

statement_timestamp()현재 명령문의 시작 시간 (특히 클라이언트로부터 최신 명령 메시지를 수신 한 시간)을 리턴합니다. [...]
clock_timestamp()는 실제 현재 시간을 반환하므로 단일 SQL 명령 내에서도 값이 변경됩니다.

참고 : statement_timestamp()STABLE위는 (항상 같은 SQL 명령 내에서 동일한 값을 반환)한다. 그러나 clock_timestamp()반드시 필요합니다 VOLATILE. 차이가 클 수 있습니다.


그러나 쿼리 최적화에 차이가 있습니까? : 지금은 ()의 모든 행에 대해 실행됩니다 where items.createddate > now()?
santiago arizti

3
@santiagoarizti : No. now()STABLE동일한 트랜잭션 내에서 동일한 값 (현재 트랜잭션의 시작 시간)으로 평가되므로 정의 됩니다. 귀하의 예 now()한 번만 실행 됩니다 ( clock_timestamp()예를 들어).
Erwin Brandstetter

3

올바르게 사용할 때 기능상의 차이가 없으며, 다르게 캐스팅됩니다.

'now()'인식됨 ( 'today'또는 'now') :

b=# select 'now()'::timestamptz;
          timestamptz
-------------------------------
 2016-12-09 16:31:35.942243+00
(1 row)

'CURRENT_TIMESTAMP'어두운 가장자리에서 재미있는 오류를 제공 합니다

참고 : PostgreSQL 버전 7.2부터 '현재'는 더 이상 날짜 / 시간 상수로 지원되지 않습니다.

b=# select 'CURRENT_TIMESTAMP'::timestamptz;
ERROR:  date/time value "current" is no longer supported
LINE 1: select 'CURRENT_TIMESTAMP'::timestamptz;
               ^

그리고 'transaction_timestamp()'단지 TZ 값이 타임 스탬프로 recongized되지 않습니다

b=# select 'transaction_timestamp()'::timestamptz;
ERROR:  invalid input syntax for type timestamp with time zone: "transaction_timestamp()"
LINE 1: select 'transaction_timestamp()'::timestamptz;
               ^

당신이 캐스팅 이유를 묻지 마십시오 'now()' as timestamp. 나는 사람들 코드에서 where timestamp_column = 'now()'대신 보았 where timestamp_column = now()으므로이 설명은 재미있는 사실이며 Erwin의 대답에 좋은 추가 요소라고 생각했습니다.


이것은 오해입니다. 입력 문자열'now()' 함수 비슷 now()표면하지만 그렇지 직접 관련되지 않는다. 현재 트랜잭션의 시작 시간을'now' 평가하는 상수 입니다. 후행 Parens는 무시됩니다. 문자열 캐스팅하려는 시도 나 에을 그건 그냥 말도 때문에 비슷한 방식으로는 실패합니다. 해당 기능과 관련이 없습니다. 'CURRENT_TIMESTAMP''transaction_timestamp()'timestamp
Erwin Brandstetter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.