mysql计算多少天后的日期_数据库 - mysql 计算某个时间,多少天后,多少个月后时间戳...

数据库设计(一): 数据库设计步骤:  需求分析-------->  逻辑设计 ------------> 物理设计----------->维护优化。 【1】需求分析:分析需要存储的数据,数据的特性,数据的生命周期。 【2】逻辑设计: 【3】物理设计: 【4】维护优化: 举一个列子:比如一

id start_time period_ytpe period_value 1 1461427200 day 3 2 1461427200 month 2

如上表,

start_time 表示开始时间,

period_ytpe 表示期限类型,

period_value表示期限值,

第一第记录表是 3天,第二条表示2个月

如果查询出,从start_time开始,期限在今天之前的记录

比如:

第一条,start_time开始, 三天后的时间戳,如果是在今天(2016-06-04)之前,则是满足条件!

第二条,start_time开始, 两个月后的时间戳,如果是在今天(2016-06-04)之前,则是满足条件!

____________________________________分割线_________________________________________

感谢各位的回答,在不改数据库的情况下(数据表已经被很多地方引用,且不是我设计),我自己写了一条SQL,做了几步转换,感觉性能不会好,但好像可以用了,还好这个表数据量不大,每天最多新增一条新记录。

把开始start_time转为date,再DATE_ADD加上 日或者月,得到时间再转为 unix_time

用今天凌晨 UNIX_TIMESTAMP(CURDATE())减去 上面得到的时候,如果结果大于 0,那就是想要的结果

SELECT `id`,`name`,

CASE `period_type`

WHEN 'day'

THEN UNIX_TIMESTAMP(CURDATE())-UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(`start_time`),INTERVAL period_value day))

WHEN 'month'

THEN UNIX_TIMESTAMP(CURDATE())-UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(`start_time`),INTERVAL period_value month))

ELSE ''

END AS 'time_interval'

FROM `table`

WHERE `xxxxxxx'

HAVING time_interval>0

ORDER BY time_interval desc,

不知道你用的啥语言。

用最笨的办法~~

先用你的语言获取到今天的时间戳。例如1465056000

SELECT * FROM `table` WHERE `period_ytpe` = 'day' AND `start_time` + 86400*`period_value` < 1465056000

UNION

SELECT * FROM `table` WHERE `period_ytpe` = 'month' AND `start_time` + 86400*30*`period_value` < 1465056000

当然缺陷就是,一个月默认当他30天了。

如果你是要用mysql去计算。。那把start_time存成时间类型吧。。然后用date_add去计算

AND话外题。。为啥设计表的时候不直接算好end_time呢?非要筛选的时候去用,计算类的会导致索引失效,很不好。各种扫表,

時間存儲建議將字段設置為 timestamp 或者 datetime 類型, 而不是數值類型的時間戳.

首先數值類型的時間戳不便於 SQL 中查詢, 另代碼中也需要進行轉換

在數值類型 SQL 中相關函數也無法使用, 需要先對數值類型時間戳轉換城 timestamp 或者 datetime 類型在計算【目的】 1.掌握MySQL数据库的使用方法。 2.掌握Java操作MySQL数据库的方法。 【目标】 目标1:MySQL数据库的基本操作,包括MySQL的安装、创建数据库、数据表、增删改查操作(80分)。 目标2:Java操作MySQL数据库,包括基本步骤和具体的编码实现(90分)。

如果是 timestamp 或者是 datetime 可以使用 date_add 函數增加或者減少時間達到時間的要求

例如

select date_add(start_time, interval 1 day) from t

給 start_time 增加一天,

明确问题,你应该是要求start_time在某天或者某月之后的时间戳。

思路:用当前时间转换成date格式,将date加上你要获取的某天或某月的数值,然后将结果转成时间戳

date_add(date,interval n exp)

其中date为date时间格式,如果是时间戳需要转换,exp可以为

SECOND 秒 SECONDS MINUTE 分钟 MINUTES HOUR 时间 HOURS DAY 天 DAYS MONTH 月 MONTHS

YEAR 年 YEARS MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS" HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"

DAY_HOUR 天和小时 "DAYS HOURS" YEAR_MONTH 年和月 "YEARS-MONTHS"

HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS" DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES" DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"

1.从start_time开始3天后的时间戳:

MYSQL代码如下

select UNIX_TIMESTAMP(date_add(FROM_UNIXTIME(start_time), interval 3 day)) from t

3代表你要加的天数,将T换成你的数据库的任意表执行即可

2.从start_time开始N月后的时间戳:

select UNIX_TIMESTAMP(date_add(FROM_UNIXTIME(start_time), interval 3 MONTH)) from t

此函数数MYSQL的,其他数据库也有相应的函数,但是没有测过。,

试着写了一下,失败了。

期望的SQL:

SELECT * FROM table

WHERE start_time < UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE, INTERVAL `period_value` `period_type`));

结果以上SQL语法有误,

较为接近的SQL:

SELECT * FROM table

WHERE start_time < UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE, INTERVAL `period_value` DAY));

但这就用不上period_type字段了。

其实正如@lyt8384 所说,在SQL语句里运用不适当的运算会让索引失效的,查询效率也会相应下降。

如果有权限改变表结构的话,可以新增一个end_time字段,end_time(单位:s)=start_time + period_type * period_value,然后对end_time字段做索引,这样做应该比较好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值