mysql 日期 1970_Mysql中处理1970年前的日期(unixtime为负数的情况)负数时间戳格式化...

article/2025/8/22 10:48:08

客户扔过来一个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 1234567SECOND);> 1970-01-15 14:56:07

这是没有问题的,unixtime为负数的情况下:

> SELECT DATE_ADD(FROM_UNIXTIME(0), INTERVAL -1234567SECOND);> 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

'年-月'

转: https://blog.unlink.link/sql/mysql_before_1970_minus_unixtime.html

mysql的from_unixtime只能处理1970~2038年的时间戳,超过必须要上面的思路,并且int长度也只能表示到2038年,bigint可以表示的范围大些

bf9f90a8556e51200bd5bff9f80827c0.png


http://chatgpt.dhexx.cn/article/BPKiPItl.shtml

相关文章

C语言里的fabs()和sqrt()的含义

fabs()其实是指绝对值&#xff0c;例如fabs(a)就是指a的绝对值&#xff0c;在程序中使用的时候需要包含头文件<math.h>。而sqrt()是指开根号&#xff0c;例如sqrt(a)就是指根号a。 举个例子&#xff1a; 假如从键盘任意输入a&#xff0c;b&#xff0c;e的值&#xff0c;编…

求绝对值指针c语言,C语言实现abs和fabs绝对值

C语言 abs() 函数用于求整数的绝对值。 头文件&#xff1a;math.h 或者 stdlib.h 语法/原型&#xff1a; int abs(int n); n 表示要求绝对值的数。 返回值&#xff1a;参数的绝对值。 【实例1】使用 abs() 函数求整数 3 和 -4 的绝对值。 #include #include int main() { int a…

c语言中fabs是什么意思,c语言fabs是什么意思_后端开发

C语言sqrt函数的用法_后端开发 C语言中sqrt函数用于计算一个非负实数的平方根&#xff0c;使用时需要在头部引入math.h文件&#xff0c;用法示例&#xff1a;sqrt(25)&#xff0c;程序将返回5。 c语言fabs是什么意思&#xff1f; fabs函数是一个求绝对值的函数&#xff0c;求出…

c语言中fabs是什么意思,c语言fabs是什么意思

c语言fabs是什么意思&#xff1f; fabs函数是一个求绝对值的函数&#xff0c;求出x的绝对值&#xff0c;和数学上的概念相同&#xff0c;函数原型是extern float fabs(float x)&#xff0c;用法是#include 。 推荐学习&#xff1a;c语言视频教程 fabs()函数的声明&#xff1a;d…

c语言fabs函数的返回值,fabs()函数

fabs函数是一个求绝对值的函数&#xff0c;求出x的绝对值&#xff0c;和数学上的概念相同&#xff0c;函数原型是extern float fabs(float x)&#xff0c;用法是#include 。 C语言中fabs()函数&#xff1a; (1)描述&#xff1a;C库函数double fabs(double x) &#xff0c;返回浮…

CSS overflow 属性(琐碎知识点整理)

本文详细的介绍了 CSS overflow 属性的 ‘定义和用法’ ‘属性效果’ 废话不多说, 直接上代码以及图例 (为了让大家方便阅读, 都有自己验证过程的一些图片作为分享) 。 一. overflow 定义和用法: 1. overflow 属性规定当内容溢出元素框时发生的事情 。2. 这个属性定义溢出元…

CSS 处理溢出 overflow属性

在CSS中&#xff0c;如果设置了一个盒子的宽度与高度&#xff0c;则盒子中的内容就可能超过盒子本身的宽度或高度。此时&#xff0c;可以使用 overflow 属性来控制内容溢出时的处理方式。 overflow属性的可选值有 visible | hidden | scroll | auto&#xff0c;除了body 和 te…

text-overflow属性的使用

text-overflow属性的使用 text-overflow属性规定了当文本溢出包含元素时所发生的事情。 取值&#xff1a; 当遇到标题过长&#xff0c;影响页面效果的情况时&#xff0c;text-overflow属性发挥它的作用&#xff0c;如下图所示&#xff1a; 重点&#xff1a; 利用text-overflo…

CSS中overflow属性介绍

原文地址&#xff1a;http://blog.sina.com.cn/s/blog_51048da701017yyp.html overflow属性规定当内容溢出元素框时发生的事情&#xff0c;有四个参数&#xff0c;分别是&#xff1a; visible&#xff1a;内容不会被修剪&#xff0c;会呈现在元素框之外&#xff0c;这是默认的值…

CSS的overflow属性简析

overflow定义:设定如果内容溢出元素设定范围后该怎么做. overflow:visible;默认属性,就是毫不作为,让内容跑到元素外面去.overflow:hidden;常用属性,超出的部分给他隐藏了.overflow:auto;常用属性,父元素中内置滚动条来处理,根据内容的具体宽高生成上下或左右滚动条.overflow:…

css overflow属性及使用方法(场景)

overflow这个属性还是挺实用的比如&#xff0c;一个div展示文字&#xff0c;想让超出部分隐藏就可以使用overflow:hidden,想让显示的画就用overflow:scroll; 1.overflow的属性 值描述visible默认值。内容不会被修剪&#xff0c;会呈现在元素框之外。hidden内容会被修剪&#…

CSS 溢出overflow属性的使用

作者:WangMin 格言:努力做好自己喜欢的每一件事 CSDN原创文章 博客地址 &#x1f449; WangMin 在CSS中&#xff0c;如果给一个盒子设置了固定的宽度与高度&#xff0c;但内容过多就会溢出盒子本身的宽度或高度。此时&#xff0c;就可以使用 overflow 属性来控制内容溢出时的处…

overflow属性的常用值详解

什么是overflow 在CSS中&#xff0c;overflow是“溢出”的意思&#xff0c;该属性规定当内容溢出元素框时发生的事情&#xff0c;设置内容是否会被修剪&#xff0c;溢出部分是否会被隐藏&#xff1b;例如当属性值设置为“visible”则内容不会被修剪&#xff0c;为“hidden”则内…

CSS中的 overflow 属性

overflow 属性指定在元素的内容太大而无法放入指定区域时是剪裁内容还是添加滚动条。 overflow 属性可设置以下值&#xff1a; visible - 默认。溢出没有被剪裁。内容在元素框外渲染hidden - 溢出被剪裁&#xff0c;其余内容将不可见scroll - 溢出被剪裁&#xff0c;同时添加…

overflow元素溢出属性

当子元素尺寸超过父元素尺寸时&#xff0c;需要设置父元素显示溢出子元素的方式&#xff0c;通过overflow属性来设置。 overflow设置值 1、visible 默认值。内容不会被修剪&#xff0c;会呈现在元素框之外。 2、hidden 内容会被修剪&#xff0c;并且其余内容是不可见的&#…

css溢出属性:overflow属性介绍

✍ 什么是溢出呢&#xff0c;为什么要讲溢出属性呢。下面我们创建一个200*150的div标签大小&#xff0c;背景色为橙色&#xff0c;内容为一串英文 代码演示&#xff1a; 结果&#xff1a; 结果发现这个文本有溢出的情况&#xff0c;背景上放不下这个文本&#xff0c;所以有一部…

浅析CSS中的overflow属性

随时随地阅读更多技术实战干货&#xff0c;获取项目源码、学习资料&#xff0c;请关注源代码社区公众号(ydmsq666) overflow属性的作用是规定当内容溢出元素框时发生的事情&#xff0c;定义溢出元素内容区的内容会如何处理。 overflow有下面几种属性值&#xff0c;分别如下&am…

overflow属性(溢出)详解

目录 一&#xff1a;什么是overflow 1.1 overflow的属性 二&#xff1a;实例分析 一&#xff1a;什么是overflow 在CSS中&#xff0c;overflow是“溢出”的意思&#xff0c;该属性规定当内容溢出元素框时发生的事情&#xff0c;设置内容是否会被修剪&#xff0c;溢出部分是否…

overflow属性详解

overflow属性详解_桃花扇J的博客-CSDN博客_overflow属性 原链接 overflow是对溢出内容的处理&#xff0c;有四个属性值visible&#xff0c;hidden&#xff0c;scroll&#xff0c;auto&#xff0c;且可以分别设置overflow-x&#xff0c;overflow-y&#xff0c;需要注意的是&am…

CSS3:overflow属性详解

1.Overflow overflow为溢出&#xff08;容器&#xff09;&#xff0c;当内容超出容器时只需添加overflow属性值为hidden&#xff0c; 就可以把超出容器的部分隐藏起来&#xff1b; 如果内容超出容器却又不想其隐藏时可以将其属性值设置为auto&#xff1b; overflow&#xff…