【问题标题】:Datepart result format as timeDatepart 结果格式为时间
【发布时间】:2016-08-15 04:34:51
【问题描述】:

我有这个问题

SELECT 
    d.Nip,d.FullName,b.*,c.InTime,c.OutTime, 
    (SELECT DATEPART(HOUR, OutTime)) - (SELECT DATEPART(HOUR, InTime)) as lebih 
FROM 
    DinasAuditHeader a 
INNER JOIN
    DinasAuditDetail b on a.KodeAuditHeader = b.KodeAuditHeader 
INNER JOIN
    Attendance c on b.Nip = c.Nip and b.attendancedate = c.AttendanceDate 
INNER JOIN
    employee d on c.Nip = d.Nip 
WHERE
    b.Nip = '1502427' 
    AND c.AttendanceCode = 'P3' 
    AND a.KodeAuditHeader = 'AD0000001'

从查询中我得到这个结果

Nip      FullName   KodeDetailDinas KodeAuditHeader nip    AttendanceDate   claim_status    InTime                      OutTime         lebih
1502427 FERNANDO ALIM      1          AD0000001   1502427   2016-08-28           0      2016-08-28 08:55:00.000 2016-08-28 21:03:00.000 13
1502427 FERNANDO ALIM      3          AD0000001   1502427   2016-08-30           0      2016-08-30 08:55:00.000 2016-08-30 18:03:00.000 10
1502427 FERNANDO ALIM      2          AD0000001   1502427   2016-08-29           0      2016-08-29 08:55:00.000 2016-08-29 19:03:00.000 11
1502427 FERNANDO ALIM      4          AD0000001   1502427   2016-08-31           0      2016-08-31 08:50:00.000 2016-08-31 20:03:00.000 12

从我的查询和结果中可以看出。我有一个名为lebih 的专栏。 lebihInTimeOutTime 之间的结果范围。

我有两个问题。

  1. 从我上面的查询中我只能得到hour。那么如何转换成这种格式hh:mm

  2. 如何查看它们之间的范围(OutTime - InTime)然后用- 08:00 减去?

【问题讨论】:

  • 时间和时间之间的范围是什么意思?你能分享一些关于如何计算价值的信息
  • 2016-08-28 21:03:00.000 - 2016-08-28 08:55:00.000 但只有datetime part
  • 我不明白,哪个日期时间部分,是分钟,..?
  • 我的英语写作和说得不好,对不起。列OutTimeInTime
  • 你可以试试我在下面发布的查询

标签: sql sql-server-2008


【解决方案1】:

你可以试试SELECT CONVERT(VARCHAR(5),(OutTime - InTime),108) AS lebih

以下 Sql 查询应该适用于您的情况:

SELECT 
    d.Nip,d.FullName,b.*,c.InTime,c.OutTime, 
    CONVERT(VARCHAR(5),(OutTime - InTime),108) AS lebih
FROM 
    DinasAuditHeader a 
INNER JOIN
    DinasAuditDetail b on a.KodeAuditHeader = b.KodeAuditHeader 
INNER JOIN
    Attendance c on b.Nip = c.Nip and b.attendancedate = c.AttendanceDate 
INNER JOIN
    employee d on c.Nip = d.Nip 
WHERE
    b.Nip = '1502427' 
    AND c.AttendanceCode = 'P3' 
    AND a.KodeAuditHeader = 'AD0000001'

更新:

要从 lebih 中减去 8 小时,您可以使用

CONVERT(VARCHAR(5), DATEADD(HOUR, -8, OutTime - InTime), 108) AS lebih

【讨论】:

    【解决方案2】:

    对于第 1 个问题。你可以使用 @Unnikrishnan R 答案。然后对于第二个尝试下面的查询。

    SELECT 
        d.Nip,d.FullName,b.*,c.InTime,c.OutTime, LEFT(CAST(DATEADD(MINUTE,DATEDIFF(MINUTE,InTime,OutTime),'2011-01-01 00:00') AS TIME),5) lebih ,
        LEFT(CAST(DATEADD(MINUTE,DATEDIFF(MINUTE,InTime,DATEADD(HOUR, -8, OutTime)),'2011-01-01 00:00') AS TIME),5) 
    FROM DinasAuditHeader a 
     INNER JOIN DinasAuditDetail b on a.KodeAuditHeader = b.KodeAuditHeader 
     INNER JOIN Attendance c on b.Nip = c.Nip and b.attendancedate = c.AttendanceDate 
     INNER JOIN employee d on c.Nip = d.Nip 
    WHERE b.Nip = '1502427' and c.AttendanceCode = 'P3' and a.KodeAuditHeader = 'AD0000001'
    order by KodeDetailDinas asc
    

    【讨论】:

      【解决方案3】:

      使用脚本获取 'HH:MM' 中的时差。

      SELECT 
          d.Nip,d.FullName,b.*,c.InTime,c.OutTime, 
          LEFT(CAST(DATEADD(MINUTE,DATEDIFF(MINUTE,InTime,OutTime),'2011-01-01 00:00') AS TIME),5) as lebih
      FROM DinasAuditHeader a 
       INNER JOIN DinasAuditDetail b on a.KodeAuditHeader = b.KodeAuditHeader 
       INNER JOIN Attendance c on b.Nip = c.Nip and b.attendancedate = c.AttendanceDate 
       INNER JOIN employee d on c.Nip = d.Nip 
      WHERE b.Nip = '1502427' and c.AttendanceCode = 'P3' and a.KodeAuditHeader = 'AD0000001'
      

      查看示例查询的结果。 Time difference in HH:MM

      【讨论】:

      • 你能解释一下这是什么2011-01-01 00:00 吗?
      • 我可以在查询中做数学吗?例如lebih - 08:00 hour的值
      • 这只是将结果转换为预期时间格式的一个技巧。只需在 datediff 函数的结果中添加一个日期(任何日期),时间和第二个字段为 00:00。我们可以'不将分钟差显式转换为时间数据类型。
      【解决方案4】:

      VARCHAR 附加到':00' 的简单转换怎么样?

      SELECT 
          d.Nip,d.FullName,b.*,c.InTime,c.OutTime, 
          cast((SELECT DATEPART(HOUR, OutTime)) - (SELECT DATEPART(HOUR, InTime)) AS VARCHAR(2)) + ':00' as lebih 
          FROM DinasAuditHeader a 
          inner join DinasAuditDetail b on a.KodeAuditHeader = b.KodeAuditHeader 
          inner join Attendance c on b.Nip = c.Nip and b.attendancedate = c.AttendanceDate 
          inner join employee d on c.Nip = d.Nip 
      where b.Nip = '1502427' and c.AttendanceCode = 'P3' and a.KodeAuditHeader = 'AD0000001'
      

      如果你想精确到MINUTE,最好使用DATEDIFF

      select 
          d.Nip,d.FullName,b.*,c.InTime,c.OutTime, 
          cast(DATEDIFF(MINUTE, InTime, OutTime) / 60) as varchar(2)) + ':' 
          + cast(DATEDIFF(MINUTE, InTime, OutTime) % 60) as varchar(2))
          FROM DinasAuditHeader a 
          inner join DinasAuditDetail b on a.KodeAuditHeader = b.KodeAuditHeader 
          inner join Attendance c on b.Nip = c.Nip and b.attendancedate = c.AttendanceDate 
          inner join employee d on c.Nip = d.Nip 
      where b.Nip = '1502427' and c.AttendanceCode = 'P3' and a.KodeAuditHeader = 'AD0000001'
      

      如果您想将时间结果再分 8 小时,您可以先将 OutTime 8 小时向后推。

      select 
          d.Nip,d.FullName,b.*,c.InTime,c.OutTime, 
          cast(DATEDIFF(MINUTE, InTime, DATEADD(HOUR, -8, OutTime)) / 60) as varchar(2)) + ':' 
          + cast(DATEDIFF(MINUTE, InTime, DATEADD(HOUR, -8, OutTime)) % 60) as varchar(2))
          FROM DinasAuditHeader a 
          inner join DinasAuditDetail b on a.KodeAuditHeader = b.KodeAuditHeader 
          inner join Attendance c on b.Nip = c.Nip and b.attendancedate = c.AttendanceDate 
          inner join employee d on c.Nip = d.Nip 
      where b.Nip = '1502427' and c.AttendanceCode = 'P3' and a.KodeAuditHeader = 'AD0000001'
      

      【讨论】:

      • 我该怎么做lebih coloum - 08:00
      • @YVS1102 抱歉,我不太明白。你的意思是把时间倒转8小时吗?
      • 我的意思是用 8 小时减去它
      猜你喜欢
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      相关资源
      最近更新 更多