2011-04-21 11 views
9

Esto devuelve 1 (también conocido como TRUE) haceMySQL: DATE_SUB/DATE_ADD que cuenta para DST?

SELECT DATE_SUB(NOW(), INTERVAL 24*100 HOUR) = DATE_SUB(NOW(), INTERVAL 100 DAY); 

100 días, el día de la hora no cambia. Pero debido al horario de verano (EE. UU.), Hace 100 períodos de veinticuatro horas es en realidad una hora antes que si contara por días. Si la declaración anterior representaba el horario de verano, devolvería 0 o FALSE.

¿Hay alguna manera en que puedo decir para dar cuenta del horario de verano para una declaración o sesión determinada? Preferiría no usar UNIX_TIMESTAMP ya que corta algo más allá de 2038.

+1

Esto podría ser útil http://stackoverflow.com/questions/1646171/mysql-datetime-fields-and-daylight-savings-time-how -do-i-reference-the-extra (improbable tiene una cura en mysql) – ajreal

+0

¡Chico! ¿[Me gustaría poder escribir un tipo de datos personalizado] (http://dba.stackexchange.com/questions/5098/is-there-such-thing-as-custom-data-types) que funciona correctamente! –

+0

Tendrá que escribir su propia función DATE_SUB que tenga en cuenta el horario de verano. Por cierto, me encantaría estrangular a quien haya inventado esa pesadilla de DST. – Johan

Respuesta

-2

¿Cómo cortando cualquier cosa más allá 2038 ser un verdadero problema cuando se puede estar seguro de que las marcas de tiempo de 64 bits enteros serán immplemented todas partes 20 años antes de que por lo menos?

En serio, hay tantos problemas con los tipos datetime/timestamp en MySQL que deberías tratar de evitarlos cuando sea posible.

¿Almacena muchas fechas más allá de 2038?

Y, ¿por qué no prueba usar PostgreSQL que tiene soporte de tipo mucho más avanzado?

+0

Limitar a 2038 agrega una ligera complejidad. Por ejemplo, repetir eventos en un calendario. Obviamente, 2038 no es un problema real, pero me gusta hacer las cosas de la manera correcta, si hay una forma correcta. En cuanto al cuarto párrafo, ya estamos en MySQL, no creo que haya muchas razones para hacer un cambio tan importante. –

+0

Meta: http://meta.stackoverflow.com/questions/284044/is-this-really-an-answer – cybermonkey

4

Tendrá que crear una función personalizada, algo como esto.

DELIMITER $$ 

CREATE FUNCTION DST(ADatetime DATETIME) RETURNS DATETIME 
BEGIN 
    DECLARE result DATETIME; 
    SET Result = ADatetime; 
    IF ADatetime >= startDST AND ADateTime <= endDST THEN 
    result = DATE_SUB(ADatetime, INTERVAL 1 HOUR); 
    END IF; 
    RETURN result; 
END $$ 

DELIMITER ; 
2

Esto es realmente sólo una cuestión de convertir a UTC y la espalda:

CONVERT_TZ(DATE_SUB(CONVERT_TZ(NOW(),@@session.time_zone,'UTC'), INTERVAL 24*100 HOUR),'UTC',@@session.time_zone); 

Esto supone que tiene las tablas de zona horaria configurada para utilizar zonas horarias con nombre. De lo contrario, puede usar '+0: 00' en lugar de 'UTC'

Cuestiones relacionadas