Является ли NOW () стабильной функцией? - PullRequest
7 голосов
/ 01 сентября 2011

Если я делаю

INSERT INTO table1 (datetime1, datetime2) VALUES (NOW(),NOW())

Будут ли оба поля всегда идентичны в обоих столбцах?

То же самое для

INSERT INTO table1 (datetime1, datetime2) VALUES (NOW(),NOW())
                                                ,(NOW(),NOW()) 

Будет ли все четыре записи базы данных иметь одинаковое значение или возможно, что row1 <> row2?

Обратите внимание, что это теоретический вопрос, а не work-around вопрос.
Я просто очень хочу знать, как и почему.

Ответы [ 5 ]

10 голосов
/ 01 сентября 2011

С Postgres now() всегда возвращает отметку времени, которая обозначает начало транзакции.

Так что для вашего второго примера все четыре строки будут иметь одинаковое значение метки времени.

Если вы хотите иметь «реальную» временную метку, вы должны использовать clock_timestamp().

Подробнее в руководстве:

http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT

4 голосов
/ 01 сентября 2011

Если ваш запрос не занимает много времени, изменение, что все значения одинаковы, довольно велико. Я бы не стал на это полагаться. Лучший подход - сначала поместить значение в переменную, а не использовать эту переменную несколько раз.

2 голосов
/ 01 сентября 2011
DECLARE @Timestamp DATETIME
SELECT @Timestamp = getDate()
INSERT INTO table1 (datetime1, datetime2) VALUES (@Timestamp, @Timestamp)

Вышеуказанное создаст равные значения в обоих полях таблицы, если вы этого хотите.

Если база данных, которую вы используете, поддерживает NOW (), и вам нужны уникальные значения даты и времени, ваш запрос выдаст ее, хотя изменения во времени будут короткими.

2 голосов
/ 01 сентября 2011

Если вы должны иметь их все одинаково, вам лучше сначала определить переменную now и установить для нее все столбцы.

0 голосов
/ 30 сентября 2011

Оказывается, уже был вопрос, похожий на ваш, но он был специально о MySQL .

Как следует из ответа Ричарда, значение, возвращаемое NOW(), фиксируется в начале выполнения оператора и никогда не изменяется до завершения выполнения, что подтверждается документацией. Как и в PostgreSQL, в MySQL есть и другая функция, которая возвращает фактическую временную метку, которая соответствует времени оценки конкретной части инструкции, содержащей функцию, и эта функция SYSDATE().

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...