2017-10-21 124 views
0

我有一个数据类型为datetime的列,导入数据的方式始终是前一天到今天。其中日期时间在列时间的上午12点和列时间的第二天上午10点之间

表中没有存储历史数据 - 之前的数据在导入新数据之前被删除。

这就是说我想写一个where子句,其中我的ESTEndTime列在时间戳列的00:00:00和时间戳列的第二天的10:00:00之间。

我已经搜索,但找不到具体到我正在寻找什么。

目的是主要捕捉那些在夜间工作的人的最终时间。数据导出时,它始终导出为前一天至第二天,例如10月1日至10月2日。这将使我们能够看到过夜工作人员的最新注销时间。在我刚刚提到的例子中,数据将包括从10月1日00:00:00到10月2日23:59:59的所有内容。我们无法限制到特定时间。所以,当我希望实现的时候,使用这个例子将它限制在10月1日00:00:00到10月2日10:00:00之间的where子句中。问题是我不想使用那些实际的日期,因为我的日期总是在变化,所以我在这里寻求帮助。

代码,我有,但没有得到预期的结果

SELECT timestamp, emp_id, dept, ESTStartTime, ESTEndTime 
    ,CONCAT(emp_id, '-', FORMAT(ESTStartTime, 'yyyy/MM/dd-HH:mm')) AS Index2Start 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd-HH:mm')) AS Index3Stop 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd')) AS Index3StopDay 

FROM   dbo.[test] 
WHERE ESTEndTime BETWEEN DATEADD(DAY, DATEDIFF(DAY, 0, timestamp), 0) + '00:00' 
      AND DATEADD(DAY, DATEDIFF(DAY, 1, timestamp), 1) + '10:00' 
ORDER BY ESTEndTime DESC 
+0

帖子你写到目前为止请代码。 –

+0

“,其中我的日期时间列在日期时间列的00:00:00到日期时间列的第二天的10:00:00之间。这没有意义。 –

+0

是的你是正确的,我的意思是'我的ESTEndTime列在00:00:00的时间戳列和10:00:00的时间戳列的那一天之间'。 – sly123

回答

0

这里是另一个可能的方式,你可以尝试

SELECT DISTINCT ee.* 
FROM table ee 
CROSS APPLY (
    select MIN(timestamp) AS timestamp, NextDate = DATEADD(HOUR,10,DATEADD(DAY,1,MIN(timestamp))) from table 
) maxdate 
WHERE ee.ESTEndTime BETWEEN maxdate.timestamp AND maxdate.NextDate 
+0

感谢spittingfire。这也有效。非常感激 – sly123

0

看看这会为你工作。我声明了2个变量来保存前一天的日期和时间以及当天的日期和时间。我用GETDATE()获取当前日期和时间。我从中提取日期部分,并减去前一天的一天。然后我将日期转换为VARCHAR并增加了时间。 SQL Server将隐式地将该字符串转换回DATETIME值。

--Previous day at 12:00am 
DECLARE @prevday DATETIME = CONVERT(VARCHAR,CONVERT(DATE,(DATEADD(DD,-1,GETDATE())))) + ' 12:00AM'; 
--Current day at 10:00am 
DECLARE @currentday DATETIME = CONVERT(VARCHAR,CONVERT(DATE,GETDATE())) + ' 10:00 AM' ; 

SELECT timestamp, emp_id, dept, ESTStartTime, ESTEndTime 
    ,CONCAT(emp_id, '-', FORMAT(ESTStartTime, 'yyyy/MM/dd-HH:mm')) AS Index2Start 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd-HH:mm')) AS Index3Stop 
    ,CONCAT(emp_id, '-', FORMAT(ESTEndTime, 'yyyy/MM/dd')) AS Index3StopDay 

FROM   dbo.[test] 
WHERE ESTEndTime BETWEEN @prevday AND @currentday 
ORDER BY ESTEndTime DESC 
+0

谢谢杰森。这解决了我的问题。非常感谢 – sly123

相关问题