【问题标题】:Adding data to column将数据添加到列
【发布时间】:2014-03-02 06:00:39
【问题描述】:

我编写了这个查询来显示员工在特定日期的总工作时间和加班时间(如果他来了)。我想要一个特定日期的人的 INtime 和 OutTime 是否为空,然后将 00:00 放入他的 intime、outtime、totalworkingtime、overtime 中,例如现在是星期天,显然没有 InTime 和 OutTime,那么它应该在时间列中显示 00:00。 注意:只有在提到人员 InTIme 时才输入日期,否则没有 DateVisited。

例如

EmplID  EmplName ShiftID intime Outtime totalworking overtime  dateVisited
0000001 John     S001    00:00  00:00   00:00:       00:00     2013-12-01

查询:

with times as (

SELECT    t1.EmplID

        , t3.EmplName

        , min(t1.RecTime) AS InTime

        , max(t2.RecTime) AS [TimeOut]

        , t4.ShiftId as ShiftID

        , t4.StAtdTime as ShStartTime

        , t4.EndAtdTime as ShEndTime

        , cast(min(t1.RecTime) as datetime) AS InTimeSub

        , cast(max(t2.RecTime) as datetime) AS TimeOutSub

        , t1.RecDate AS [DateVisited]

FROM  AtdRecord t1 

INNER JOIN 

      AtdRecord t2 

ON    t1.EmplID = t2.EmplID 

AND   t1.RecDate = t2.RecDate

AND   t1.RecTime < t2.RecTime

inner join 

      HrEmployee t3 

ON    t3.EmplID = t1.EmplID 

inner join AtdShiftSect t4

ON t3.ShiftId = t4.ShiftId

group by 

          t1.EmplID

        , t3.EmplName

        , t1.RecDate

        , t4.ShiftId 

        , t4.StAtdTime 

        , t4.EndAtdTime

)
SELECT 

 EmplID

,EmplName
,ShiftId As ShiftID

,InTime
,[TimeOut]
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) TotalWorkingTime

,[DateVisited]
,CASE WHEN [InTime] IS NOT NULL AND [TimeOut] IS NOT NULL THEN

     CONVERT(char(5),CASE WHEN  CAST([TimeOutSub] AS DATETIME) >= ShEndTime And ShiftID = 'S002' Then  LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST(ShEndTime AS DATETIME),CAST([TimeOutSub] AS DATETIME)),0), 108),5) 

                          WHEN  CAST([TimeOutSub] AS DATETIME) >= ShEndTime And ShiftID = 'S001' Then  LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST(ShEndTime AS DATETIME),  CAST([TimeOutSub] AS DATETIME)),0), 108),5) 

      ELSE '00:00' END, 108) 

 ELSE 'ABSENT' END AS OverTime

FROM times  order by EmplID, ShiftID, DateVisited

【问题讨论】:

  • 你已经有一个CASE 声明,这里有什么问题?
  • 问题是假期我应该在时间段中提到 00:00
  • 抱歉,我可能只是需要更多的咖啡。我们怎么知道今天是假期?
  • 这是问题,这是真正的问题,先生
  • 先生,一定有什么办法可以绕过它吗?我已经浪费了几个小时尝试它,但无法提供帮助

标签: sql sql-server sqlite tsql sql-server-2008-r2


【解决方案1】:

如果您的问题仅取决于知道日期何时是工作日/节假日/周末,我建议您使用 DataWarehouse 解决方案。创建一个包含所有假期/周末的表并对其进行检查。

根据您使用的日历和其他日期,有许多脚本可以为您创建它,但最简单的方法是在接下来的 10 年左右计算您所有假期的时间。例如圣诞节总是在 12 月 23 日,感恩节总是在 11 月的第 3 周,我会创建一个这样的表格

CREATE TABLE Holiday
(
HolidayID INT NOT NULL, --surrogate key, but you can just as easily make HolidayDate the Natural key
HolidayDate  DATE NOT NULL
HolidayName NVARCHAR(30),--encase you need non English holiday names saved
...
...
..


INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2014-12-23, 'Christmas')
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2015-12-23, 'Christmas')
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2016-12-23, 'Christmas')
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2017-12-23, 'Christmas')
.....
.....
....

或者,如果您想更深入地了解,您可以在一张表(日期维度表)中绘制未来 10 年的每一天。然后将那些日子标记为假期,取消工作,销售季度等等。 (谷歌日期维度表)

【讨论】:

  • 先生我怎么听不懂
  • 你有什么困惑,如果你愿意,什么时候可以逐步复习
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2016-12-28
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多