我有一个包含四列的表格:
我需要以小时为单位计算datefrom和dateto(datefrom-dateto)之间的差异,将此差异添加到其他列中。主要的是日期的一些单元格是空的。在这种情况下,我应该将“dateto”作为当前日期和时间。
第二件事是使用if statment添加列。如果datefrom和date之间的差异超过3小时,则为0。
现在我只能计算小时数的差异。主要问题是空单元格和额外的列语句,当小于3时
select id, DateFrom, DateTo, UserId,
(Datefrom-DateTO) as hours
from table
order by id
答案 0 :(得分:0)
这是MS SQL的一个很好的例子:
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate ='2007-06-05'
SET @EndDate ='2007-08-05'
SELECT DATEDIFF(Hour, @StartDate, @EndDate) AS NewDate
--Return Value = 1464 Hour
SELECT DATEDIFF(minute, @StartDate, @EndDate) AS NewDate
--Return Value = 87840 minute
SELECT DATEDIFF(second, @StartDate, @EndDate) AS NewDate
--Return Value = 5270400 second
答案 1 :(得分:0)
您需要一些控件Flow Functions 选择后,您将需要:
SELECT id, datefrom, dateto, userid
你可以使用IFNULL(),如果dateto是NULL,那么它将返回CURDATE():
IFNULL(dateto, CURDATE())
还有一个IF(condition, truth, false)
,但首先,你需要几个小时的差异。您可以使用某些Date and Time Functions进行计算,您将获得日期之间的差异,将其转换为秒,然后除以3600):
TIME_TO_SEC(TIMEDIFF(IFNULL(dateto, CURDATE()), datefrom)) / 3600
现在,检查它是否大于3:
IF(TIME_TO_SEC(TIMEDIFF(IFNULL(dateto, CURDATE()), datefrom)) / 3600 > 3, 1, 0)
最后,它会像:
SELECT
id,
datefrom,
dateto,
userid,
TIME_TO_SEC(TIMEDIFF(IFNULL(dateto, CURDATE()), datefrom)) / 3600
IF(TIME_TO_SEC(TIMEDIFF(IFNULL(dateto, CURDATE()), datefrom)) / 3600 > 3, 1, 0),
FROM table;
答案 2 :(得分:0)
谢谢大家。
我在Periscope中编写了代码。我不知道为什么,但我可以使用一些函数作为TIME_TO_SEC,TIMEDIFF,TIMESTAMPDIFF。
最终代码如下。
SELECT id
, DateFrom
, DateTo
, UserId
, CASE
WHEN DateFrom is null OR (DateFrom - DateTo) < '0 days 00:00:00'
THEN (NOW() - DateTo)
ELSE (DateFrom - DateTo)
END as hours
, CASE
WHEN (DateFrom IS NULL AND (NOW() - DateTo) > '0 days 03:00:00') OR (DateFrom is not null and ((DateFrom - DateTo) > '0 days 03:00:00') OR (DateFrom - DateTo) < '0 days 00:00:00')
THEN 1
ELSE 0
END as Attribute