首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用the来执行SQL服务器中两列之间的减号?

如何使用the来执行SQL服务器中两列之间的减号?
EN

Stack Overflow用户
提问于 2019-11-13 08:27:04
回答 3查看 68关注 0票数 0

我在Server中有一个名为Employee的表:

代码语言:javascript
运行
复制
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 :(下面是我期望的表)

代码语言:javascript
运行
复制
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下午

有人对此有想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-13 08:46:01

使用DATEDIFF,不是DAY,而是MINUTESECOND。下面的示例返回1天,但实际时间是2秒:

代码语言:javascript
运行
复制
SELECT
    DATEDIFF(
        DAY,
        '2019-01-01 23:59:59',
        '2019-01-02 00:00:01')

DATEDIFFDAY将不考虑时间部分,它只会查看当天的差异。

所以你可以用一个较低的程度来测量一天,比如几分钟或几秒:

代码语言:javascript
运行
复制
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!

结果:

代码语言:javascript
运行
复制
SecondDifferences   FullDaysBySecond    MinuteDifferences   FullDaysByMinute    DayDifferences
104401              1                   1741                1                   2

所以ALTER应该是:

代码语言:javascript
运行
复制
ALTER TABLE Employee ADD Duration AS DATEDIFF(
        MINUTE, 
        [Clock-In], 
        ISNULL([Clock-Out], GETDATE())) 
    / 1440

您将无法持久化此列,因为GETDATE()是非确定性的,Server不允许您这样做,这意味着每次查询它时都会计算它。

票数 1
EN

Stack Overflow用户

发布于 2019-11-13 08:29:48

使用datediff()coalesce()

代码语言:javascript
运行
复制
select employee,
ClockIn,ClockOut,
datediff(day,ClockIn,coalesce(ClockOut,getdate())) as duration
from table_name

为此,您可以创建如下所示的视图

代码语言:javascript
运行
复制
create view view_name AS
select employee,
ClockIn,ClockOut,
datediff(day,ClockIn,coalesce(ClockOut,getdate())) as duration
from table_name
票数 3
EN

Stack Overflow用户

发布于 2019-11-13 08:28:29

使用datediff()和sql server isnull()函数,因为您的columnsdash一起使用,所以您需要转义它。

代码语言:javascript
运行
复制
select Employee
  , [Clock-In]
  , [Clock-Out]
  , datediff(dd, [Clock-In], isnull([Clock-Out], getdate())) as Duration
from Employee 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58832997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档