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

嫣如舜华 2013-12-31 11:44:06
如何写SQL 语句??
...全文
573 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tenhilltree 2014-01-01
  • 打赏
  • 举报
回复
引用 9 楼 xinguotiantian 的回复:
[quote=引用 8 楼 DBA_Huangzj 的回复:] 给点数据看看,顺便调试脚本

CREATE TABLE [dbo].[TEST](
	[编码] [int] NOT NULL,
	[人员姓名] [varchar](20) NOT NULL,
	[开始时刻] [datetime] NOT NULL,
	[结束时刻] [datetime] NULL,
 CONSTRAINT [PK_TEST] PRIMARY KEY CLUSTERED 
(
	[编码] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
go
[/quote] 结束时刻为可空类型?那如果结束时刻为null时,怎么算工作时间,是算到开始时间后的第一个10点或19点吗
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
sqlserver的版本是多少?
嫣如舜华 2013-12-31
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
给点数据看看,顺便调试脚本

CREATE TABLE [dbo].[TEST](
	[编码] [int] NOT NULL,
	[人员姓名] [varchar](20) NOT NULL,
	[开始时刻] [datetime] NOT NULL,
	[结束时刻] [datetime] NULL,
 CONSTRAINT [PK_TEST] PRIMARY KEY CLUSTERED 
(
	[编码] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
go

insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(1,'测试1','2013-12-19 11:58:10','2013-12-19 12:59:26')
insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(2,'测试2','2013-12-19 18:58:10','2013-12-19 18:59:26')
insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(3,'测试1','2013-12-19 20:58:10','2013-12-19 20:59:26')
insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(4,'测试1','2013-12-20 06:58:10','2013-12-20 07:59:26')
insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(5,'测试1','2013-12-20 18:58:10','2013-12-20 18:59:26')
insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(6,'测试2','2013-12-21 21:58:10','2013-12-21 22:59:26')
insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(7,'测试1','2013-12-21 09:58:10','2013-12-21 10:59:26')
insert into TEST(编码,人员姓名,开始时刻,结束时刻) values(8,'测试1','2013-12-21 13:58:10','2013-12-21 14:59:26')
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
给点数据看看,顺便调试脚本
嫣如舜华 2013-12-31
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
这个工作时长有什么具体规则吗
表结构是这样:(列:人员名称、工作的开始时刻、结束时刻),我不知道如何取时间,比如,查询时间是:2013-12-01 08:30:00 至2013-12-04 08:30:00 查出10:00-19:00 的工作时长,19:00-第二天10:00的工作时长
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
给点测试数据吧,最好有期待结果,文本贴出来
嫣如舜华 2013-12-31
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
说的不够详细啊,19~10点如果你不说清楚怎么才算工作时间,那不就15个小时咯?
条件我没写出来(列:人员名称、工作的开始时刻、结束时刻),我不知道如何取时间,比如,查询时间是:2013-12-01 08:30:00 至2013-12-04 08:30:00 查出10:00-19:00 的工作时长,19:00-第二天10:00的工作时长
LongRui888 2013-12-31
  • 打赏
  • 举报
回复
这样吗:

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')
LongRui888 2013-12-31
  • 打赏
  • 举报
回复
这个工作时长有什么具体规则吗
小魚人 2013-12-31
  • 打赏
  • 举报
回复
能說具體點嗎
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
说的不够详细啊,19~10点如果你不说清楚怎么才算工作时间,那不就15个小时咯?
mkinglife 2013-12-31
  • 打赏
  • 举报
回复
传递的参数需要为年月日的格式,不知道楼主传递的参数是不是这样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') 之前也遇到这样问题,也就是分时段查询开始时间作为一个时段,结束时间作为一个时段。。
發糞塗牆 2013-12-31
  • 打赏
  • 举报
回复
你试试,不行再改
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
嫣如舜华 2013-12-31
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
sqlserver的版本是多少?
2008

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧