MySQL TIMESTAMP column with CURRENT_TIMESTAMP

在部署程序时遇到的一个问题,MySQL定义举例如下:

CREATE TABLE `example` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `lastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

这段SQL是我从项目中摘取出来的,在测试机器上一切正常,但是部署到生产机器上MySQL报错:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.

继续阅读

Python非标准的日期字符串处理(解析、转换、比较)

我之前有篇文章介绍利用VB/VBScript根据出生日期来计算年龄,文中介绍了函数ComputeAge,当时为了处理一些Word或者Excel中非标准的时间的,当然这个函数除了能计算年龄外也能转换这些非标准的时间字符串到程序语言支持的时间变量。

只要不是太畸形的时间字符串表示法,基本上ComputeAge都能处理,不过这次有个项目需要用到Python,于是要写个类似的函数来分析处理非标准的时间表示字符串。

当然我不想像上次那样写上一堆if,然后再用程序语言专有函数来分割处理字符串,再转换,太吃力不讨好了,所以我这次尝试使用正则表达式进行模式匹配切割字符串。

我分析了形如19920203、199203、1992.02.03、1992.02、1992-02-03、1992-02、920203时间格式特征,列出了正则表达式如下:

^((?:19|20)?\d{2})[-.]?((?:[0-1]?|1)[0-9])[-.]?((?:[0-3]?|[1-3])[0-9])?$

当然这个表达式还不是很完善,只能做简单的切割,不能判断日期的合法性,关于日期是否合法,我还是交给Python的时间功能来处理吧。

继续阅读

获取系统安装日期与Unix时间戳(Unix timestamp)

我们在安装Windows系统时,系统已经给我们将第一次初始装机的日期写入到注册表中,以便于我们以后备查,最通常的做法是开始-运行-输入cmd确定,打开命令提示符,输入systeminfo这个命令,然后就会获取初始安装日期。那么这个日期究竟保存在注册表什么地方呢?

使用regedit打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion分支,在右边键值中找到InstallDate,对的这个就是我们要找的安装日期。

注册表系统安装日期.png

我们双击这个日期,这时注册表显示“编辑 DWORD 值”对话框,默认基数是16进制的,我们先改成10进制的,什么?看不懂这个时间?先不急,这个是Unix时间戳,接下来我就要介绍这个。

继续阅读