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()
에 해당하는 기존 PostgreSQLtransaction_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()
대부분의 컨텍스트 에서 함수와 동일한 타임 스탬프로 평가 됩니다 . 그러나 이들은 상수 이며 일반적 으로 열 기본값으로 원하는 것이 아닙니다 .
주목할만한 대안은 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의 대답에 좋은 추가 요소라고 생각했습니다.