now ()와 current_timestamp의 차이점

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)

뭔가 빠졌습니까?



답변

다른 점이 없다. 매뉴얼에서 인용 한 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. 차이가 클 수 있습니다.


답변

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

'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의 대답에 좋은 추가 요소라고 생각했습니다.