Могу ли я получить два разных результата из UNIX_TIMESTAMP в одном запросе? - PullRequest
4 голосов
/ 20 мая 2011

Это кажется очевидной вещью, но я просто не уверен в правильном ответе.

Если я использую команду INSERT / UPDATE в одном запросе mysql, могу ли я получить два разных результата из UNIX_TIMESTAMP? То есть время меняется во время одного запроса?

Пример:

UPDATE my_table SET
time1 = UNIX_TIMESTAMP(),
...
...
time2 = UNIX_TIMESTAMP(),
...

Возможно ли, что time2 будет больше, чем time1?

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

Если возможно, предоставьте некоторую справочную информацию для вашего ответа. Спасибо!

Ответы [ 3 ]

3 голосов
/ 21 мая 2011

Функции времени и даты MySQL возвращают время / дату начала оператора, поэтому, если вы выполните:

CREATE TABLE t ( x INT );
INSERT INTO t SELECT UNIX_TIMESTAMP() FROM (10M rows table)  -- takes several seconds
SELECT DISTINCT x FROM t;

DISTINCT возвращает одно значение, которое соответствует времени, когда INSERT начал выполняться.

1 голос
/ 21 мая 2011

В mysql unix_timestamp () похож на now () - он возвращает время, когда оператор начал выполняться, и отличается от sysdate (), который возвращает время, когда сама функция выполняется.

CREATE TABLE test ( date datetime, tstamp int(11) );
INSERT INTO test VALUES( 0,0 ), ( 0,0 ), ( 0,0 );
UPDATE test SET date=sysdate(), tstamp=unix_timestamp() WHERE !sleep(2);
+---------------------+------------+
| date                | tstamp     |
+---------------------+------------+
| 2011-05-20 22:39:58 | 1305923996 |
| 2011-05-20 22:40:00 | 1305923996 |
| 2011-05-20 22:40:02 | 1305923996 |
+---------------------+------------+
1 голос
/ 21 мая 2011

Я не знаю ответа на ваш вопрос. Однако, если ваша мотивация заключается в получении согласованных временных отметок при записи в таблицу, почему бы не воспользоваться следующим подходом: создать хранимую процедуру. Внутри процедуры присвойте переменную, используя UNIX_TIMESTAMP(), и выполните запрос UPDATE или INSERT, используя переменную, а не дальнейшие вызовы UNIX_TIMESTAMP(). Таким образом, вам гарантировано правильное поведение.

Пример:

CREATE PROCEDURE "My_Insert_Procedure" ()
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINER
BEGIN

DECLARE my_time DATETIME;
SET my_time = UNIX_TIMESTAMP();

UPDATE my_table SET
time1 = my_time,
...
...
time2 = my_time,
...

END

CALL My_Insert_Procedure();
...