Mysql中处理1970年前的日期(unixtime为负数的情况)负数时间戳格式化
客户扔过来一个bug,说是一个系统中对42岁以上的人的统计不正确,而41岁以下的人没有问题。眼睛瞟了一下托盘区里的日期,2012年3月26日,嗯,今年42岁的话,那么应该就是出生在1970年左右,马上就把问题锁定在了unixtime上,嗯,重点怀疑!
小贴士:UNIX时间,或称POSIX时间是UNIX或类UNIX系统使用的时间表示方式:从协调世界时1970年1月1日0时0分0秒起至现在的总秒数,不包括闰秒。——来自《维基百科》
看了一下数据库,生日是以int形式保存的,有正有负。这没啥问题嘛。
再看代码,SQL语句中有一个类似下面的条件语句:
WHERE FROM_UNIXTIME(birthday, '%Y') = XXX
其中的birthday是存放生日日期的unixtime值的字段,int类型的。XXX由PHP的date('Y', timestamp)来算出年份。在我的印象中,PHP的date函数处理负数的时间戳是没有问题的(注:PHP4在windows下不能处理负数时间戳,PHP5则没有这个问题。客户的服务器是Linux的,PHP4也没有问题)。好吧,那么我就开始怀疑FROM_UNIXTIME函数了,以前还真没怎么注意这玩意。随手写两个测试:
> SELECT FROM_UNIXTIME(1);
> 1970-01-01 08:00:01
看来FROM_UNIXTIME还与时区有关系。继续来:
> SELECT FROM_UNIXTIME(-1);
> NULL
哦耶,FROM_UNIXTIME果然不支持负数。测试版本为Mysql 5.1.x
这是一个条件语句,又不能拿出来由PHP处理。当然办法还是很多,比如把生日所在年换一个以unixtime表示的年龄段等等。但是我们只讨论如何用mysql计算负数的unixtime。
我们知道了unixtime表示的是从1970年1月1日0时0分0秒开始到现在的秒数,而为负的情况就是1970年第一天之前的秒数,那么可不可以通过时间计算来算出来呢?查手册,找到一个date_add函数,可以计算时间的加减。那我们就以1970年的第一天(unixtime=0的时候)作为基准来手动计算吧。由于Mysql的日期计算基本上都和时区有关系,我也懒得去搞了,就写一个大一点的秒数来看看结果:
> SELECT DATE_ADD(FROM_UNIXTIME(0), INTERVAL 1234567 SECOND);
> 1970-01-15 14:56:07
这是没有问题的,unixtime为负数的情况下:
> SELECT DATE_ADD(FROM_UNIXTIME(0), INTERVAL -1234567 SECOND);
> 1969-12-18 01:03:53
哦耶!成功了!那么剩下的问题就简单了,将本文开始的查询条件修改为:
WHERE DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), INTERVAL birthday SECOND),'%Y') = XXX
就没问题了,BUG去除成功。
本例中用了到INTERVAL关键字,由于它不止可以用于date_add函数,那下面再总结一下DATE_ADD函数的单位(从官方手册里抄来的,为了方便理解,有一点小修改):
使用格式:INTERVAL expr type
举例:
DATE_ADD(date,INTERVAL
expr type)
DATE_SUB(date,INTERVAL expr type)
date +/-INTERVAL expr type等。
关键词INTERVA及
type分类符均不区分大小写。
| type值 | 预期的expr格式 |
|---|---|
| MICROSECOND | 整数 |
| SECOND | 整数 |
| MINUTE | 整数 |
| HOUR | 整数 |
| DAY | 整数 |
| WEEK | 整数 |
| MONTH | 整数 |
| QUARTER | 整数(季节) |
| YEAR | 整数 |
| SECOND_MICROSECOND | '秒.毫秒' |
| MINUTE_MICROSECOND | '分钟数.毫秒' |
| MINUTE_SECOND | '分:秒' |
| HOUR_MICROSECOND | '小时数.毫秒' |
| HOUR_SECOND | '时:分:秒' |
| HOUR_MINUTE | '时:分' |
| DAY_MICROSECOND | '日期号数.毫秒' |
| DAY_SECOND | '日 时:分:秒' |
| DAY_MINUTE | '日 时:分' |
| DAY_HOUR | '日 小时' |
| YEAR_MONTH | '年-月' |

Mysql中处理1970年前的日期(unixtime为负数的情况)负数时间戳格式化的更多相关文章
- 关于JDBC技术中,调用MySQL中不建议在没有服务器身份验证的情况下建立SSL连接错误解决
今天学习到了JBDC前沿:对JDBC编写步骤的封装,出现了一大串红色报错(当然,也不能叫报错,毕竟不是所有的红色都是错误eeror,) 错误如下: Establishing SSL connectio ...
- MYSQL中关于日期处理的函数
< DOCTYPE HTML PUBLIC -WCDTD HTML TransitionalEN> MySQL数据库中SQL语句中 关于日期.时间\时间戳的函数 一 MySQL 获得当 ...
- mysql 中时间和日期函数应用
一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +-------------------- ...
- mysql 中 时间和日期函数
From: http://www.cnblogs.com/redfox241/archive/2009/07/23/1529092.html 一.MySQL 获得当前日期时间 函数 1.1 获得当前日 ...
- mysql中时间日期函数
转自:mysql 中 时间和日期函数 一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +- ...
- Java中日期类型和mysql中日期类型进行整合
1. java与mysql中日期.时间类型总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 mysql(版本:5.1.50)的时间日期类型如下: da ...
- mysql中查看某个日期是星期几?如何知道某个日期是星期几?某个日期是周几?
需求描述: mysql中,如果要查看某个日期是星期几,可以用date_format函数实现,在此记录下. 操作过程: 1.通过date_format函数查看某个日期是星期几 mysql> sel ...
- TIMESTAMP类型字段在SQL Server和MySQL中的含义和使用
公众号上转的满天飞的一篇文章,MySQL优化相关的,无意中瞄到一句“尽量使用TIMESTAMP而非DATETIME”,之前对TIMESTAMP也不太熟悉,很少使用,于是查了一下两者的区别. 其实,不管 ...
- MySQL中日期和时间类型
1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割 ...
随机推荐
- 9、Django实战第9天:用户注册功能
今天完成的是用户注册功能... 首先把注册页面的前端文件register.html复制到templates目录下 编辑users.views.py,创建一个注册的类 class RegisterVie ...
- NGUI_Sprites
一.UI Sprites 控件: Sprites控件是NGUI的基础控件,几乎可以这么说所有的控件都可以基于Sprites控件添加 Box Collider然后进行附加相关的脚本组件来达到想要的插件效 ...
- MongoError: topology was destroyed解决方法
MongoError: topology was destroyed 分析得出,出现这个问题是因为,当mongodb尝试写入某个数据的时候,连接被中断了! 解决方法:检查代码中是否存在操作数据的过程中 ...
- [美团 CodeM 初赛 Round A]最长树链
题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...
- 1.2(Spring MVC学习笔记) Spring MVC核心类及注解
一.DispatcherServlet DispatcherServlet在程序中充当着前端控制器的作用,使用时只需在web.xml下配置即可. 配置格式如下: <?xml version=&q ...
- iOS开发中几种常见的存储方式
1.archive 归档 数据的保存 1: let result = NSKeyedArchiver.archiveRootObject(contacts, toFile: path as Strin ...
- coco2dx-2.2.2 win32启动过程(opengl 和 窗口大小初始化部分) - 学习笔记 1
因为最近要做不同分辩率的适配,所于看了下引擎这方面的代码,记录一下当是学习笔记,cocos2d-x 版本 2.2.2 , 例子是samples\Cpp\TestCpp下的 TestCpp. 先看下ma ...
- mysql 中查询一个字段是否为null的sql
查询mysql数据库表中字段为null的记录: select * 表名 where 字段名 is null 查询mysql数据库表中字段不为null的记录: select * 表名 where 字段名 ...
- 【Sofa】Sofa比赛成绩记录
最高得到过第4名,然后后面跌倒了第7名,现在追到了第6名.虽然名次还不是最高,但是很开心,今天能在一道一直困扰的题目上有突破,就是那个自行车预测的题目,开始过拟合了.后面进行了一些处理,效果很明显.继 ...
- Linux下sqlite3编程
---------------------------------------------------------------------------------------------------- ...