在MySQL和Python中以可重复的方式处理1970年之前的日期

时间:2010-10-23 05:36:06

标签: python mysql sphinx epoch

在我的MySQL数据库中,我的日期可以追溯到1700年代中期,我需要以类似于Unix时间的格式以某种方式转换为整数。 int的值并不重要,只要我可以从我的数据库或用户输入中获取日期并生成相同的int。我需要使用MySQL在数据库端生成int,并使用python从用户转换日期。

通常情况下,UNIX_TIMESTAMP function会在MySQL中完成此任务,但对于1970年之前的日期,它总是返回零。

TO_DAYS MySQL function也可以工作,但我无法从用户输入中获取日期并使用Python创建与此函数在MySQL中创建的值相同的值。

基本上,我需要一个像UNIX_TIMESTAMP这样的函数,它可以在MySQL和Python中工作,用于1700-01-01和2100-01-01之间的日期。

换句话说,这个MySQL伪代码:

select 1700_UNIX_TIME(date) from table;

必须等于这个Python代码:

1700_UNIX_TIME(date)

2 个答案:

答案 0 :(得分:2)

我这里没有安装MySQL,但是当我看到这里时:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_to-days - 我看到一个示例TO_DAYS('2008-10-07')返回733687。

以下Python函数返回datetime(2008,10,7).toordinal() = 733322,比MySQL的输出少365。

所以这个:

from datetime import datetime

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

它适用于1700到2100之间的日期。

答案 1 :(得分:2)

根据您提供的链接,

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

Python中的相应数字:

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

所以关系是:mySQL_int == Python_int + 365,你可以使用fromordinal类方法转换到另一个方向:

>>> datetime.date.fromordinal(728779 - 365)
datetime.date(1995, 5, 1)