加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

伟大的MySQL计时器

发布时间:2021-01-18 19:22:19 所属栏目:编程 来源:网络整理
导读:假如我们有一个从CURRENT_TIMESTAMP-1小时开始的计时器,我们可以简朴地计较出时差并返回3600秒. 可是,假如我们但愿计时器仅在一天的特按时刻计数,而只说事变日或指定日期事变,该怎么办?查察下面的代码以查察“建设”语句,以更好地领略 CREATE TABLE `timer`

假如我们有一个从CURRENT_TIMESTAMP-1小时开始的计时器,我们可以简朴地计较出时差并返回3600秒.

可是,假如我们但愿计时器仅在一天的特按时刻计数,而只说事变日或指定日期事变,该怎么办?查察下面的代码以查察“建设”语句,以更好地领略

CREATE TABLE `timer` (
  `Id`             BIGINT        NOT NULL  AUTO_INCREMENT,`title`          VARCHAR(100)  NOT NULL,`startAt`        DATETIME      NOT NULL,`startTime`      TIME                    DEFAULT NULL,`endTime`        TIME                    DEFAULT NULL,`monday`         BOOLEAN                 DEFAULT 1,`tuesday`        BOOLEAN                 DEFAULT 1,`wednesday`      BOOLEAN                 DEFAULT 1,`thursday`       BOOLEAN                 DEFAULT 1,`friday`         BOOLEAN                 DEFAULT 1,`saturday`       BOOLEAN                 DEFAULT 1,`sunday`         BOOLEAN                 DEFAULT 1,`dateReg`        TIMESTAMP     NOT NULL  DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY  (`Id`)

) ENGINE=InnoDB AUTO_INCREMENT=1  COMMENT 'Timer';

留意:startime和endtime暗示从两个日期开始计较秒数时计时器将思量的小时数.如上所述的计时器没有竣事时刻,这意味着它将永久不会遏制

此刻有人说可以在查询中完成,而且确定它们是正确的,可是我小我私人以为,在存储函数中它将变得越发轻易和更好:

CREATE FUNCTION `TIMEPASSED`(iId BIGINT(100)) RETURNS BIGINT(20)
BEGIN
    DECLARE sTime TIME;
    DECLARE eTime TIME;
    DECLARE startAt DATETIME;

    #Get the Results from the Database and put them into the variables
    SELECT timer.startTime,timer.endTime,timer.startAt INTO sTime,eTime,startAt FROM tickets
    WHERE timer.Id = iId;

    #if the start time is null then return the difference between the reset time and now
    IF sTime IS NULL
       THEN RETURN (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(startAt));
    END IF;

RETURN NULL;

END

假如startTime为NULL,则上述函数仅返回计时器启动后颠末的完备秒数.

此刻让我们举办插入查询

INSERT INTO timer VALUES(NULL,'mytimer',CURRENT_TIMESTAMP,09:00,18:00,1,CURRENT_TIMESTAMP);

上面的查询提议计时器从CURRENT_TIME开始,仅在09:00和18:00之间计时,仅在礼拜一至礼拜五事变.

SELECT查询(此处的“排序依据”很重要)

SELECT *,TIMEPASSED(Id) as passed FROM timer ORDER BY passed DESC

总的来说:我想知道在输入的时刻分派的时刻内颠末的秒数

对这个科目标任何基本数学的阅读城市很谢谢.那我可以办理

感激:D

最佳谜底 假如我领略正确,那么我以为在存储进程中行使的一个好的算法是:

>从零开始计数.
>假如本日是与dateReg沟通的日期,而且礼拜几是正确的,则将最大(startTime,dateReg的时刻)-min(endTime,当前时刻)添加到计数中.
>不然,假如本日在dateReg日期之后:

>假如dateReg的对应礼拜几为true,而且dateReg的时刻在endTime之前,则将其添加到提醒符max(startTime,dateReg的时刻)-endTime.
>假如本日的礼拜几是正确的,而且当前时刻在startTime之后,则将计数添加到tally startTime-min(endTime,当前时刻)中.

>存储endTime-成天中的startTime.
>假如monday为true,则计较dateReg的日期与当前日期(不包罗在内)之间的礼拜一数.*将该数字乘以wholeDay到计数中.对一周的每一天一再一次.
>返回理货.

*这自己就是另一个题目.一种要领是计较dateReg的周之后和当前周之前的完备周数,假如dateReg的DoW(一周中的某天)之后的天在所接头的DoW之前,则加1,假如当前DoW的前一天在该DoW之后.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读