- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在生产中,我们有 3 个类次。每个 Shift 时间在表 tbl_ShiftSched 中描述:
WT - 工作时间,PT - 休息时间。ShiftTmID - 2 类和 3 类的时间表。我正在寻找简单的方法来在几分钟内获得开始和结束时间的工作时间。例如,在 #2015.05.29 06:10:00# 和 #2015.05.29 09:30:00# 和 tbl_WorkStations.WksID='GRD' 之间输入(与 ShiftTmID ='3P' 相关的工作站代码)应该给出输出190 分钟。
我在 MS Access 中有功能,可以提供我需要的输出。但是当迁移到 T-SQL 时,它变得非常复杂,因为我没有找到如何在 T-SQL 中使用别名的简单方法。这是代码:
USE [STRDAT]
GO
declare
@strWks varchar(3),
@dteIN datetime='2013.08.05 03:30',
@dteOUT datetime='2013.08.05 05:30',
@strShf varchar(12)=null,--'2013.08.04-3',
@strInd varchar(2) = 'WT',
@dteFTm datetime,
@dteShf date
--@PrdS datetime,
--@PrdE datetime
select top 1
@dteFTm =
case
when @strShf is not null
then (select shiftstart from tbl_ShiftSched where ShiftTmID=(select ShiftTiming from tbl_WorkStations where WksID=@strWks) and shift=right(@strshf,1) and sortind=1)
else @dteIN-dateadd(day,datediff(day,0,@dteIN),0) --CAST(@dteIN-cast(floor(@dteIN) as float) as datetime)
end,
@dteShf=
case
when @strShf is not null
then left(@strShf,10)
else convert(varchar,dateadd(day,datediff(day,0,@dteIN),0),102)
end
--select @dteftm,@dteShf
SELECT tbl_ShiftSched.Shift,
tbl_ShiftSched.SortInd,
[ShiftStart]+
case
when @dteFTm>[shiftstart]
then DateAdd(day,1,@dteShf)
else @dteShf
end AS PrdS,
[ShiftEnd]+
case
when @dteFTm>[shiftend]
then DateAdd(day,1,@dteShf)
else @dteShf
end AS PrdE,
case
when @dteIN>=[PrdS] AND [PrdE]>=@dteOUT
then DateDiff(minute,@dteIN,@dteOUT)
else case
when @dteIN<=[PrdS] AND [PrdE]<=@dteOUT
then DateDiff(minute,[PrdS],[PrdE])
else case
when [PrdS]<=@dteIN AND @dteIN<=[PrdE]
then DateDiff(minute,@dteIN,[Prde])
else case
when [PrdS]<=@dteOUT AND @dteOUT<=[PrdE]
then DateDiff(minute,[Prds],@dteOUT)
else 0
end
end
end
end AS Tm,
@dteIN AS S,
@dteOUT AS E,
tbl_ShiftSched.ShiftType,tbl_ShiftSched.ShiftStart,tbl_ShiftSched.ShiftEnd
FROM tbl_WorkStations
INNER JOIN tbl_ShiftSched ON tbl_WorkStations.ShiftTiming = tbl_ShiftSched.ShiftTmID
WHERE (((tbl_WorkStations.WksID)=@strWks))
当然它会给我一个错误 Invalid column name 'PrdS' and 'PrdE' because I use alias.
必须有一些更简单的方法来实现它。也许我走错方向了?...
最佳答案
每当我必须计算一个字段并在第二个字段中使用结果时,我都会使用一个公共(public)表表达式来进行第一个计算。给定这个查询,它可能看起来像这样:
with cte_preprocess as
(
SELECT tbl_ShiftSched.Shift,
tbl_ShiftSched.SortInd,
[ShiftStart]+
case
when @dteFTm>[shiftstart]
then DateAdd(day,1,@dteShf)
else @dteShf
end AS PrdS,
[ShiftEnd]+
case
when @dteFTm>[shiftend]
then DateAdd(day,1,@dteShf)
else @dteShf
end AS PrdE,
tbl_ShiftSched.ShiftType,tbl_ShiftSched.ShiftStart,tbl_ShiftSched.ShiftEnd
FROM tbl_WorkStations
INNER JOIN tbl_ShiftSched ON tbl_WorkStations.ShiftTiming = tbl_ShiftSched.ShiftTmID
WHERE (((tbl_WorkStations.WksID)=@strWks))
)
SELECT [Shift]
, SortInd
, PrdS
, PrdE
, case
when @dteIN>=[PrdS] AND [PrdE]>=@dteOUT
then DateDiff(minute,@dteIN,@dteOUT)
else case
when @dteIN<=[PrdS] AND [PrdE]<=@dteOUT
then DateDiff(minute,[PrdS],[PrdE])
else case
when [PrdS]<=@dteIN AND @dteIN<=[PrdE]
then DateDiff(minute,@dteIN,[Prde])
else case
when [PrdS]<=@dteOUT AND @dteOUT<=[PrdE]
then DateDiff(minute,[Prds],@dteOUT)
else 0
end
end
end
end AS Tm
, @dteIN
, @dteOUT
, ShiftEnd
FROM cte_preprocess
关于 CTE 的更多信息 here
关于sql - 根据轮类时间表以分钟为单位获取工作时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30839241/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!