在 MySQL 和 Python 中以可重复的方式处理 1970 年之前的日期
Posted
技术标签:
【中文标题】在 MySQL 和 Python 中以可重复的方式处理 1970 年之前的日期【英文标题】:Handling dates prior to 1970 in a repeatable way in MySQL and Python 【发布时间】:2011-04-29 11:52:54 【问题描述】:在我的 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)
【问题讨论】:
@John Machin,我想关键是我需要某种中间格式......转换的结果值是什么并不重要,只要我可以从一致地生成它MySQL 和 Python 的约会。为错别字道歉——漫长的一天。我会尝试更新问题... 2392323748 是 6 位数字的拼写错误? 只是一个友好的仅供参考:您正在寻找的术语是确定性的。 【参考方案1】:我这里没有安装 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 之间的日期。
【讨论】:
感谢@eumiro 对此进行尝试。对不起,我的解释很糟糕。我的问题现在应该好一点了。 您的代码缺少import
语句,并且所需的语句不像新手可能想象的那样import datetime' but 'from datetime import datetime' ... or alternatively, use
import datetime' 然后... datetime.datetime.strptime( ...
。您是否期望 OP 正确填补空白?
为 eumiro 提供答案,因为他足够出色,不仅回答了一次,而且回答了两次——一次是我的问题很糟糕,一次是写得很好。【参考方案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)
【讨论】:
以上是关于在 MySQL 和 Python 中以可重复的方式处理 1970 年之前的日期的主要内容,如果未能解决你的问题,请参考以下文章
如何在mysql数据库中以编程方式实现Null值? [重复]