Pergunta

No meu banco de dados MySQL, tenho datas que remontam a meados da década de 1700, que preciso converter de alguma forma em INTs em um formato semelhante ao tempo Unix. O valor do INT não é importante, desde que eu possa tirar uma data do meu banco de dados ou da entrada do usuário e gerar o mesmo int. Preciso usar o MySQL para gerar o INT no lado do banco de dados e o Python para transformar a data do usuário.

Normalmente, o Função unix_timestamp, conseguiria isso no MySQL, mas para as datas antes de 1970, sempre retorna zero.

o Para_days MySQL Função, também poderia funcionar, mas não posso tirar uma data da entrada do usuário e usar o Python para criar os mesmos valores que essa função cria no MySQL.

Então, basicamente, preciso de uma função como o Unix_timestamp que funcione no MySQL e Python para datas entre 1700-01-01 e 2100-01-01.

Coloque de outra maneira, este pseudo-código MySQL:

select 1700_UNIX_TIME(date) from table;

Deve ser igual a este código Python:

1700_UNIX_TIME(date)
Foi útil?

Solução

Não tenho o MySQL aqui instalado, mas quando olho aqui: http://dev.mysql.com/doc/refman/5.1/en/date-and time-functions.html#function_to-days - Eu vejo um exemplo TO_DAYS('2008-10-07') retornando 733687.

A seguinte função python retorna datetime(2008,10,7).toordinal() = 733322, que é 365 menos que a saída do MySQL.

Então, pegue isso:

from datetime import datetime

query = '2008-10-07'
nbOfDays = datetime.strptime(query, '%Y-%m-%d').toordinal() + 365

e deve funcionar para datas entre 1700 e 2100.

Outras dicas

De acordo com o link que você deu,

Given a date date, returns a day number (the number of days since year 0).

mysql> SELECT TO_DAYS(950501);
        -> 728779
mysql> SELECT TO_DAYS('2007-10-07');
        -> 733321

Números correspondentes em Python:

>>> import datetime
>>> datetime.date(1995,5,1).toordinal()
728414
>>> datetime.date(2007,10,7).toordinal()
732956

Então o relacionamento é: mySQL_int == Python_int + 365 e você pode converter na outra direção usando o fromordinal Método de classe:

>>> datetime.date.fromordinal(728779 - 365)
datetime.date(1995, 5, 1)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top