Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我要两个约会时间的小时,分钟,秒差_Sql_Sql Server 2008_Datetime - Fatal编程技术网

Sql 我要两个约会时间的小时,分钟,秒差

Sql 我要两个约会时间的小时,分钟,秒差,sql,sql-server-2008,datetime,Sql,Sql Server 2008,Datetime,我正在为员工开发时间管理系统 我想知道员工迟到或早退的持续时间 我有以下结构 **Attendace** AutoId --uniqueidentifier EMployeeId --uniqueidentifier Date --datetime InTime -- varchar(50) OutTime -- varchar(50) ActualInTime--datetime ActualOutTime--datetime 我想要晚来报告,即谁在实施时间

我正在为员工开发时间管理系统

我想知道员工迟到或早退的持续时间

我有以下结构

**Attendace**  
AutoId --uniqueidentifier             
EMployeeId --uniqueidentifier
Date   --datetime
InTime -- varchar(50)
OutTime -- varchar(50)
ActualInTime--datetime
ActualOutTime--datetime
我想要晚来报告,即谁在实施时间后的早上迟到,以及hh:mm:ss中的持续时间,我还想要早来,即谁在实际时间前的晚上早来,以及hh:mm:ss格式的持续时间


你能帮我一下吗?

因为它们是同一天,你不必担心小时数>24,你可以使用DATEDIFFsecond、time1、time2和DATEADDsecond的组合来获得datetime值

要格式化为hh:nn:ss,请使用convertchar8,answer,8,但这是由报告前端根据datetime结果更好地完成的

-- Late report
select *, dateadd(s,0,datediff(s,intime,actualintime)) late_by
from attendance
where intime < actualintime

此代码可能会帮助您

DECLARE @First datetime
DECLARE @Second datetime
SET @First = '04/02/2008 05:23:22'
SET @Second = getdate()

SELECT DATEDIFF(day,@First,@Second)*24 as TotalHours,
DATEDIFF(day,@First,@Second)*24*60 as TotalMinutes,
DATEDIFF(day,@First,@Second)*24*60*60 as TotalSeconds

好的,是的,你需要使用DATEDIFF,是的,上面发布的所有内容都有效,但是,如果你想显示07:07:07而不是7:7:7,你必须这样做:

Declare @starttime datetime, @endtime datetime, @seconds int, @minutes int, @hours int

Set @starttime ='2013-10-01 05:05:17'
Set @endtime = '2013-10-01 23:10:18'

set @hours = DateDiff(hour, @starttime, @endtime) 
set @minutes = DateDiff(minute, @starttime, @endtime);
set @seconds = DateDiff(second, @starttime, @endtime);

select case when DateDiff(minute, @starttime, @endtime) > 60 
        then CASE WHEN @hours >= 10 THEN cast(@hours as varchar(3))
                 ELSE '0' + cast(@hours as varchar(3)) END +':' + 
             CASE WHEN @minutes - (@hours * 60) >= 10 THEN
                 cast((@minutes - (@hours * 60)) as varchar(3))
                 ELSE '0' +cast((@minutes - (@hours * 60)) as varchar(3)) END
             + CASE WHEN (@seconds - (@minutes *60)) >= 10 THEN
                 +':' + cast(@seconds - (@minutes *60) as varchar(10)) 
                 ELSE ':0' + cast(@seconds - (@minutes *60) as varchar(10)) END
        ELSE '0' + cast(@minutes as varchar(3)) +':' + cast(@seconds as varchar(10)) 
end

它可能看起来不太好看,但它给了我想要的东西。

你可以用一种非常简单的方式来做:

declare  @date1 datetime, @date2 datetime
set @date1=DATEADD(s,-638,getdate())
set @date2=GETDATE()

select convert(char(8),dateadd(s,datediff(s,@date1,@date2),'1900-1-1'),8)
。。。结果是00:10:38 638s=600s+38s=10分38秒

另一个例子:

select distinct convert(char(8),dateadd(s,datediff(s, CRDATE , GETDATE() ),'1900-1-1'),8) from sysobjects order by 1
它将一直工作,直到相差86399秒23:59:59:

select convert(char(8),dateadd(s,datediff(s
    , DATEADD(s,-86399,GETDATE())
    , GETDATE()
),'1900-1-1'),8)
。。。之后,它将返回到零:

select convert(char(8),dateadd(s,datediff(s
    , DATEADD(s,-86400,GETDATE())
    , GETDATE()
),'1900-1-1'),8)
这是对我有用的东西。谢谢你@lynx_74


我遇到了一个更容易解决这个问题的方法

首先,一个将秒数转换为hh:mm:ss格式的快速示例

DECLARE @NumberOfSeconds int
SET @NumberOfSeconds = 3843     --  1 hour, 4 minutes, 3 seconds

SELECT @NumberOfSeconds AS 'seconds',
   CONVERT(varchar, DATEADD(second, @NumberOfSeconds, 0), 108) AS 'hh:mm:ss'
这将为我们提供以下输出:

我们可以更进一步,计算两个日期时间之间的秒数,并以hh:mm:ss格式显示:

这给了我们这个输出:

简单,嘿

是的,您可以通过将DATEDIFF直接放入DATEADD函数来进一步简化它。

使用CAST怎么样

,CAST (Table1.DateTimeLatest-Table1.DateTimeFirst as time) as [Elapsed Time]
仪器表中SSMS的原始结果:

对于粘贴在格式化Excel表中的报告:

创建一个存储过程来完成这项工作,然后调用该过程并传递开始和结束日期

CREATE PROCEDURE [dbo].[GetOperationDuration]  
   @DurationStart DATETIME, @DurationEnd DATETIME,
   @Duration VARCHAR(100) OUTPUT
AS  
BEGIN  
DECLARE @years INT, @months INT, @days INT,
   @hours INT, @minutes INT, @seconds INT, @milliseconds INT;

-- DOES NOT ACCOUNT FOR LEAP YEARS
SELECT @years = DATEDIFF(yy, @DurationStart, @DurationEnd)
IF DATEADD(yy, -@years, @DurationEnd) < @DurationStart 
SELECT @years = @years-1
SET @DurationEnd = DATEADD(yy, -@years, @DurationEnd)

SELECT @months = DATEDIFF(mm, @DurationStart, @DurationEnd)
IF DATEADD(mm, -@months, @DurationEnd) < @DurationStart 
SELECT @months=@months-1
SET @DurationEnd= DATEADD(mm, -@months, @DurationEnd)

SELECT @days=DATEDIFF(dd, @DurationStart, @DurationEnd)
IF DATEADD(dd, -@days, @DurationEnd) < @DurationStart 
SELECT @days=@days-1
SET @DurationEnd= DATEADD(dd, -@days, @DurationEnd)

SELECT @hours=DATEDIFF(hh, @DurationStart, @DurationEnd)
IF DATEADD(hh, -@hours, @DurationEnd) < @DurationStart 
SELECT @hours=@hours-1
SET @DurationEnd= DATEADD(hh, -@hours, @DurationEnd)

SELECT @minutes=DATEDIFF(mi, @DurationStart, @DurationEnd)
IF DATEADD(mi, -@minutes, @DurationEnd) < @DurationStart 
SELECT @minutes=@minutes-1
SET @DurationEnd= DATEADD(mi, -@minutes, @DurationEnd)

SELECT @seconds=DATEDIFF(s, @DurationStart, @DurationEnd)
IF DATEADD(s, -@seconds, @DurationEnd) < @DurationStart 
SELECT @seconds=@seconds-1
SET @DurationEnd= DATEADD(s, -@seconds, @DurationEnd)

SELECT @milliseconds=DATEDIFF(ms, @DurationStart, @DurationEnd)

SELECT @Duration= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')    
     + ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
     + ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
     + ISNULL(' ' + CAST(@seconds AS VARCHAR(10)) 
     -- UNCOMMENT THEFOLLOWING IF YOU WANT MILLISECONDS INCLUDED
     --+ CASE
            --WHEN @milliseconds > 0
                --THEN '.' + CAST(@milliseconds AS VARCHAR(10)) 
            --ELSE ''
       --END 
     + ' seconds','')

SELECT @Duration
END
GO
然后,只需使用以下方式拨打电话: 声明@return\u value int,@Duration varchar100

EXEC@return\u value=[dbo].[GetOperationDuration]@DurationStart、@DurationEnd、@Duration=@Duration输出


选择@Duration作为N'@Duration'

查看函数。InTime和ActualInTime之间有什么区别。为什么InTime不是datetime?这只是一个补充问题,在使用SQL Server 2008时,可以使用新的日期和时间数据类型,而不是datetime/VARCHAR50。非常适合这种情况。因为我们使用AM/PM以24小时格式存储,所以将其保存为varcharSELECT DATEDIFFhour、'2020-06-10 07:16:11.823',GETUTCDATE作为TotalHours选择DATEDIFFminute,'2020-06-10 07:16:11.823',GETUTCDATE作为TotalMinutes
,CAST (Table1.DateTimeLatest-Table1.DateTimeFirst as time) as [Elapsed Time]
CREATE PROCEDURE [dbo].[GetOperationDuration]  
   @DurationStart DATETIME, @DurationEnd DATETIME,
   @Duration VARCHAR(100) OUTPUT
AS  
BEGIN  
DECLARE @years INT, @months INT, @days INT,
   @hours INT, @minutes INT, @seconds INT, @milliseconds INT;

-- DOES NOT ACCOUNT FOR LEAP YEARS
SELECT @years = DATEDIFF(yy, @DurationStart, @DurationEnd)
IF DATEADD(yy, -@years, @DurationEnd) < @DurationStart 
SELECT @years = @years-1
SET @DurationEnd = DATEADD(yy, -@years, @DurationEnd)

SELECT @months = DATEDIFF(mm, @DurationStart, @DurationEnd)
IF DATEADD(mm, -@months, @DurationEnd) < @DurationStart 
SELECT @months=@months-1
SET @DurationEnd= DATEADD(mm, -@months, @DurationEnd)

SELECT @days=DATEDIFF(dd, @DurationStart, @DurationEnd)
IF DATEADD(dd, -@days, @DurationEnd) < @DurationStart 
SELECT @days=@days-1
SET @DurationEnd= DATEADD(dd, -@days, @DurationEnd)

SELECT @hours=DATEDIFF(hh, @DurationStart, @DurationEnd)
IF DATEADD(hh, -@hours, @DurationEnd) < @DurationStart 
SELECT @hours=@hours-1
SET @DurationEnd= DATEADD(hh, -@hours, @DurationEnd)

SELECT @minutes=DATEDIFF(mi, @DurationStart, @DurationEnd)
IF DATEADD(mi, -@minutes, @DurationEnd) < @DurationStart 
SELECT @minutes=@minutes-1
SET @DurationEnd= DATEADD(mi, -@minutes, @DurationEnd)

SELECT @seconds=DATEDIFF(s, @DurationStart, @DurationEnd)
IF DATEADD(s, -@seconds, @DurationEnd) < @DurationStart 
SELECT @seconds=@seconds-1
SET @DurationEnd= DATEADD(s, -@seconds, @DurationEnd)

SELECT @milliseconds=DATEDIFF(ms, @DurationStart, @DurationEnd)

SELECT @Duration= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')    
     + ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
     + ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
     + ISNULL(' ' + CAST(@seconds AS VARCHAR(10)) 
     -- UNCOMMENT THEFOLLOWING IF YOU WANT MILLISECONDS INCLUDED
     --+ CASE
            --WHEN @milliseconds > 0
                --THEN '.' + CAST(@milliseconds AS VARCHAR(10)) 
            --ELSE ''
       --END 
     + ' seconds','')

SELECT @Duration
END
GO