【发布时间】:2009-10-10 15:32:18
【问题描述】:
如果我们有一个从 CURRENT_TIMESTAMP - 1 小时开始的计时器,我们可以简单地计算差值并返回 3600 秒过去。
但是,如果我们希望计时器只在一天中的特定时间计数,并且只在工作日或指定日期工作,该怎么办。查看下面的代码以查看 Create 语句以更好地理解
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';
Note: The startime and endtime represent the hours the timer will take into account when counting seconds from two dates. The timer as represented above does not have a endtime meaning it will never stop
现在有人说它可以在查询中完成,我相信他们是对的,但我个人相信在存储函数中它会更容易更好:
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 为空,则上述函数仅返回自定时器启动以来经过的完整秒数。
现在让我们进行插入查询
INSERT INTO timer VALUES(NULL, 'mytimer', CURRENT_TIMESTAMP, 09:00, 18:00, 1, 1, 1, 1, 1, 0, 0, CURRENT_TIMESTAMP);
上述查询表明计时器从 CURRENT_TIME 开始,仅在 09:00 到 18:00 之间计算秒数,并且仅适用于周一至周五。
SELECT 查询,(Order By 在这里很重要)
SELECT *, TIMEPASSED(Id) as passed FROM timer ORDER BY passed DESC
一般情况下:我想知道在输入的时间分配的时间内经过的秒数
任何对本学科基础数学的参考将不胜感激。那我就可以解决了
谢谢:D
【问题讨论】:
-
仅供参考:在 SELECT 子句中调用相关函数可能会对性能产生不良影响 - 数据库将为返回的每一行调用该函数。
-
@rexem:哦,对不起,rexem,我明白你的意思了。对不起,不清楚:开始时间和结束时间代表每天计算的时间。它不代表计时器将停止的时间。计时器永远不会停止
-
如果我理解了这个问题,您不只是输入开始时间,然后从 NOW() 函数中减去它以获取过去的时间吗?您也可以将时间格式化为任何格式吗? SELECT (UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - UNIX_TIMESTAMP(startAt)) AS lapsedTime FROM ...
-
@Phil:如果你有一个简单的计时器来计算两个日期......我想做的是计算在星期一和星期二的 09:00 和 18:00 之间省略其余的日子。如果这有什么好笑的?