日期:2014-05-17  浏览次数:20727 次

SQL 查询每天晚上19点到第二天10点的工作时长,查询时间段为3天。
如何写SQL 语句??

------解决方案--------------------
这样吗:


select *
from 表
where 字段 >= convert(varchar(10),GETDATE(),120)+' 19:00:00'    --每天晚上19点
  and 字段 <= convert(varchar(10),dateadd(day,2,getdate()),120)+' 10:00:00' --第二天10点的工作时长



还是这样:
select convert(varchar(10),GETDATE(),120)+' 19:00:00',         --每天晚上19点
       convert(varchar(10),dateadd(day,2,getdate()),120)+' 10:00:00', --第二天10点的工作时长
       
       --时长
       DATEDIFF(hour,convert(varchar(10),GETDATE(),120)+' 19:00:00',convert(varchar(10),dateadd(day,2,getdate()),120)+' 10:00:00')



------解决方案--------------------
你试试,不行再改
DECLARE @begin DATETIME
DECLARE @end DATETIME
SET @begin='2013-12-19 08:30:00'
SET @end='2013-12-21 08:30:00'
;WITH cte AS (
SELECT * FROM TEST
WHERE 开始时刻<=@end AND 结束时刻>=@begin)


SELECT 编码,人员姓名,CASE WHEN DATEPART(HOUR,开始时刻) >=10 AND  DATEDIFF(dd,开始时刻,结束时刻)=0 AND DATEPART(HOUR,结束时刻) <=19 THEN DATEDIFF(hh,开始时刻,结束时刻)    --不跨天不加班
WHEN (DATEPART(HOUR,开始时刻) >=10 OR DATEPART(HOUR,结束时刻) >19) AND  DATEDIFF(dd,开始时刻,结束时刻)=0  THEN ABS(19-DATEPART(HOUR,开始时刻)) END [10:00-19:00 的工作时长],--不跨天加班
case WHEN DATEPART(HOUR,开始时刻) >=19 AND  DATEDIFF(dd,开始时刻,结束时刻)>0   AND DATEPART(HOUR,结束时刻)<=10  THEN 24-DATEPART(HOUR,开始时刻)+DATEPART(HOUR,结束时刻)  --跨天不加班
WHEN dATEPART(HOUR,结束时刻) >10 AND  DATEDIFF(dd,开始时刻,结束时刻)>0 AND  DATEPART(HOUR,开始时刻) <=19 THEN  24-DATEPART(HOUR,开始时刻)+DATEPART(HOUR,结束时刻)  END [19:00-第二天10:00的工作时长]
FROM cte

------解决方案--------------------
传递的参数需要为年月日的格式,不知道楼主传递的参数是不是这样ps:(开始时间:2013-12-01 结束时间:2013-12-02)查询1号晚上19点到2号上午10点
where (startTime between DATEADD(HH,19, '2013-12-01') and  DATEADD(SS,-1,2013-12-02)) or (endTime between '2013-12-02' and DATEADD(HH,10, '2013-12-02')

之前也遇到这样问题,也就是分时段查询开始时间作为一个时段,结束时间作为一个时段。。