我在Server中有一个名为Employee的表:
Employee Clock-In Clock-Out
111 11/4/2019 2:31:08 PM 11/4/2019 4:31:08 PM
112 11/4/2019 2:31:08 PM 12/4/2019 2:31:08 PM我希望在这个雇员表中有一个新的列,它是 column :(下面是我期望的表)
Employee Clock-In Clock-Out Duration(day)
111 11/4/2019 2:31:08 PM 11/4/2019 4:31:08 PM 0
112 11/4/2019 2:31:08 PM 12/4/2019 2:31:08 PM 1
113 13/4/2019 2:31:08 PM 2工期(Day)列数据将通过使用时钟输出列减去时钟-In列自动计算;但是,如果时钟超时时间为空,则将接受当前日期时间减去时钟-In列。例如,当前的日期是15/4/2019 2:31:08下午
有人对此有想法吗?
发布于 2019-11-13 08:46:01
使用DATEDIFF,不是DAY,而是MINUTE或SECOND。下面的示例返回1天,但实际时间是2秒:
SELECT
DATEDIFF(
DAY,
'2019-01-01 23:59:59',
'2019-01-02 00:00:01')DATEDIFF与DAY将不考虑时间部分,它只会查看当天的差异。
所以你可以用一个较低的程度来测量一天,比如几分钟或几秒:
DECLARE @FirstDate DATETIME = '2019-01-01 23:59:59'
DECLARE @SecondDate DATETIME = '2019-01-03 05:00:00'
SELECT
SecondDifferences = DATEDIFF(SECOND, @FirstDate, @SecondDate),
FullDaysBySecond = DATEDIFF(SECOND, @FirstDate, @SecondDate) / 86400, -- 86400 = 24*60*60
MinuteDifferences = DATEDIFF(MINUTE, @FirstDate, @SecondDate),
FullDaysByMinute = DATEDIFF(MINUTE, @FirstDate, @SecondDate) / 1440, -- 1440 = 24*60
DayDifferences = DATEDIFF(DAY, @FirstDate, @SecondDate) -- Wrong, not full 24 hours days!结果:
SecondDifferences FullDaysBySecond MinuteDifferences FullDaysByMinute DayDifferences
104401 1 1741 1 2所以ALTER应该是:
ALTER TABLE Employee ADD Duration AS DATEDIFF(
MINUTE,
[Clock-In],
ISNULL([Clock-Out], GETDATE()))
/ 1440您将无法持久化此列,因为GETDATE()是非确定性的,Server不允许您这样做,这意味着每次查询它时都会计算它。
发布于 2019-11-13 08:29:48
使用datediff()和coalesce()
select employee,
ClockIn,ClockOut,
datediff(day,ClockIn,coalesce(ClockOut,getdate())) as duration
from table_name为此,您可以创建如下所示的视图
create view view_name AS
select employee,
ClockIn,ClockOut,
datediff(day,ClockIn,coalesce(ClockOut,getdate())) as duration
from table_name发布于 2019-11-13 08:28:29
使用datediff()和sql server isnull()函数,因为您的columns与dash一起使用,所以您需要转义它。
select Employee
, [Clock-In]
, [Clock-Out]
, datediff(dd, [Clock-In], isnull([Clock-Out], getdate())) as Duration
from Employee https://stackoverflow.com/questions/58832997
复制相似问题