Estaba escribiendo una consulta donde tienes boletos en una mesa. La columna first_use_on representa el TIMESTAMP de la primera vez que se usó. first_use_on es por defecto NULL y luego se actualiza una vez que se usa solo por primera vez. Mi consulta funciona bien, pero ahora tengo la necesidad de saber fuera de la consulta si la consulta ejecutada activó first_use_on, así que pensé en agregar first_use_on = NOW() AS is_first_usage en el RETORNO. ¿Puedo estar 100% seguro de que el NOW() comparado en la devolución es siempre el mismo que el utilizado en la parte UPDATE ? ¿Podría haber algunos casos en los que difieran?
UPDATE l_codes SET first_use_on = ( CASE WHEN first_use_on IS NULL THEN NOW() ELSE first_use_on END ) WHERE l_code = 'C9TCH' AND id_mostra = 1 RETURNING first_use_on, first_use_on = NOW() AS is_first_usage, NOW() > DATE_TRUNC('day', first_use_on + INTERVAL '1 DAY') AS expired, DATE_TRUNC('day', first_use_on + INTERVAL '1 DAY') AS expiration_on;Sí. Como se especifica en la documentación por now() :
Dado que estas funciones devuelven la hora de inicio de la transacción actual, sus valores no cambian durante la transacción. Esto se considera una característica: la intención es permitir que una sola transacción tenga una noción consistente de la hora "actual", de modo que múltiples modificaciones dentro de la misma transacción lleven la misma marca de tiempo.
El inicio de la transacción es constante para todo el extracto.
Postgres: ¿se usa NOW() en más lugares de la consulta para garantizar que siempre sea igual?
Sí. Devuelve la marca de tiempo al comienzo de la transacción actual, como se explica en la documentación :
Dado que estas funciones devuelven la hora de inicio de la transacción actual, sus valores no cambian durante la transacción. Esto se considera una característica: la intención es permitir que una sola transacción tenga una noción consistente de la hora "actual", de modo que múltiples modificaciones dentro de la misma transacción lleven la misma marca de tiempo.