Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:DATEDIFF不包括两个日期内的特定时间_Sql_Sql Server - Fatal编程技术网

SQL Server:DATEDIFF不包括两个日期内的特定时间

SQL Server:DATEDIFF不包括两个日期内的特定时间,sql,sql-server,Sql,Sql Server,我试图在几分钟内得到两个日期之间的差异,是否可以将午餐时间从这个计算中排除,也就是在SQL语句中的13:30-14:00。我目前正在做的工作如下: 示例行 SetupStart StartTime SetupTime ---------------------------------------------------------------- 2017-01-23 12:56:42.000 2017-01-23 14

我试图在几分钟内得到两个日期之间的差异,是否可以将午餐时间从这个计算中排除,也就是在SQL语句中的13:30-14:00。我目前正在做的工作如下:

示例行

SetupStart                  StartTime                  SetupTime 
----------------------------------------------------------------
2017-01-23 12:56:42.000     2017-01-23 14:41:06.000     105
我目前的发言:

DATEDIFF(MINUTE, UserData.Orders.SetupStart, UserData.Orders.StartTime)  AS[SetupTime]
编辑:--------------

这是我当前的Select语句

SELECT DISTINCT 
                  TOP (100) PERCENT UserData.Resources.Name AS Resource, UserData.Orders.OrderNo, UserData.Orders.StringAttribute4 AS Customer, UserData.Orders.Product, 
                  CEILING(UserData.Orders.OpNo10Quantity) AS OpNo10Quantity, UserData.Orders.NumericalAttribute12 AS Speed, UserData.Orders.SetupStart, UserData.Orders.StartTime, 
                  UserData.Orders.EndTime, CASE ToggleAttribute1 WHEN 1 THEN 'Yes' ELSE 'No' END AS Packed, UserData.Orders.StringAttribute5 AS OrderInstructions, UserData.Orders.NextResource, 
                  UserData.Orders.DatasetId, UserData.Orders_Dataset.name AS ScheduleName, UserData.Orders.ShowOnReport, dbo.tblPreactorExportFullv10.Length AS L, 
                  dbo.tblPreactorExportFullv10.Thickness AS T, dbo.tblPreactorExportFullv10.fWidth AS W,
 DATEDIFF(MINUTE, UserData.Orders.SetupStart, UserData.Orders.StartTime) AS [SAM SetupTime]
FROM         UserData.Orders INNER JOIN
                  UserData.Resources ON UserData.Orders.Resource = UserData.Resources.ResourcesId AND UserData.Orders.Resource = UserData.Resources.ResourcesId INNER JOIN
                  UserData.Orders_Dataset ON UserData.Orders.DatasetId = UserData.Orders_Dataset.DatasetId AND UserData.Orders.DatasetId = UserData.Orders_Dataset.DatasetId INNER JOIN
                  dbo.tblPreactorExportFullv10 ON UserData.Orders.PartNo = dbo.tblPreactorExportFullv10.ProductCode
WHERE     (UserData.Orders.DatasetId = 15) AND (UserData.Resources.Name = 'Moulder 6') AND (UserData.Orders.ShowOnReport = 1)
          AND (UserData.Orders.OperationProgress <> 5)
 ORDER BY UserData.Orders.SetupStart
选择DISTINCT
排名前(100)的UserData.Resources.Name为资源,UserData.Orders.OrderNo为用户,UserData.Orders.StringAttribute4为客户,UserData.Orders.Product为用户,
上限(UserData.Orders.OpNo10Quantity)为OpNo10Quantity,UserData.Orders.NumericalAttribute12为Speed,UserData.Orders.SetupStart,UserData.Orders.StartTime,
UserData.Orders.EndTime,大小写为1,然后为“是”或“否”,最后为打包,UserData.Orders.StringAttribute5为OrderInstructions,UserData.Orders.NextResource,
UserData.Orders.DatasetId,UserData.Orders\u Dataset.name作为ScheduleName,UserData.Orders.ShowOnReport,dbo.tblPreactorExportFullv10.Length作为L,
dbo.tblPreactorExportFullv10.厚度为T,dbo.tblPreactorExportFullv10.宽度为W,
DATEDIFF(分钟,UserData.Orders.SetupStart,UserData.Orders.StartTime)为[SAM SetupTime]
从UserData.Orders内部联接
UserData.Orders.Resource=UserData.Resources.ResourcesId和UserData.Orders.Resource=UserData.Resources.ResourcesId内部联接上的UserData.Resources
UserData.Orders\u数据集位于UserData.Orders.DatasetId=UserData.Orders\u Dataset.DatasetId和UserData.Orders.DatasetId=UserData.Orders\u Dataset.DatasetId内部联接
UserData.Orders.PartNo=dbo.tblPreactorExportFullv10.ProductCode上的dbo.tblPreactorExportFullv10
其中(UserData.Orders.DatasetId=15)和(UserData.Resources.Name='Moulder 6')和(UserData.Orders.showonleport=1)
和(UserData.Orders.OperationProgress 5)
ORDER BY UserData.Orders.SetupStart

这在SQL Server中是个难题,但您可以做到:

(CASE WHEN CAST(o.SetupStart as time) > '14:00:00' OR
           CAST(o.StartTime as time) < '13:30:00'           
      THEN DATEDIFF(MINUTE, o.SetupStart, o.StartTime)
      WHEN CAST(o.SetupStart as time) >= '13:30:00' AND
           CAST(o.StartTime as time) <= '14:00:00'
      THEN 0
      WHEN CAST(o.SetupStart as time) >= '13:30:00'
      THEN DATEDIFF(MINUTE,
                    CAST(CAST(o.SetupStart as DATE) as DATETIME) + CAST('14:00:00' as TIME),
                    o.StartTime
                   )
      WHEN CAST(o.StartTime as Time) <= '14:00:00'
      THEN DATEDIFF(MINUTE,
                    o.SetStart,
                    CAST(CAST(o.StartTime as DATE) as DATETIME) + CAST('13:30:00' as TIME)
                   )
      ELSE DATEDIFF(MINUTE, o.SetupStart, o.StartTime) - 30
    END)  AS [SetupTime]
(转换时的大小写(o.SetupStart as time)>“14:00:00”或
演员阵容(按时间开始)<'13:30:00'
然后是DATEDIFF(分钟,o.SetupStart,o.StartTime)
施放时(o.SetupStart as time)>=“13:30:00”和
演员阵容(o.StartTime作为时间)='13:30:00'
然后DATEDIFF(分钟,
CAST(CAST(o.SetupStart as DATE)as DATETIME)+CAST('14:00:00'as TIME),
o、 开始时间
)

当强制转换(o.StartTime as Time)时,这在SQL Server中是一个难题,但您可以做到:

(CASE WHEN CAST(o.SetupStart as time) > '14:00:00' OR
           CAST(o.StartTime as time) < '13:30:00'           
      THEN DATEDIFF(MINUTE, o.SetupStart, o.StartTime)
      WHEN CAST(o.SetupStart as time) >= '13:30:00' AND
           CAST(o.StartTime as time) <= '14:00:00'
      THEN 0
      WHEN CAST(o.SetupStart as time) >= '13:30:00'
      THEN DATEDIFF(MINUTE,
                    CAST(CAST(o.SetupStart as DATE) as DATETIME) + CAST('14:00:00' as TIME),
                    o.StartTime
                   )
      WHEN CAST(o.StartTime as Time) <= '14:00:00'
      THEN DATEDIFF(MINUTE,
                    o.SetStart,
                    CAST(CAST(o.StartTime as DATE) as DATETIME) + CAST('13:30:00' as TIME)
                   )
      ELSE DATEDIFF(MINUTE, o.SetupStart, o.StartTime) - 30
    END)  AS [SetupTime]
(转换时的大小写(o.SetupStart as time)>“14:00:00”或
演员阵容(按时间开始)<'13:30:00'
然后是DATEDIFF(分钟,o.SetupStart,o.StartTime)
施放时(o.SetupStart as time)>=“13:30:00”和
演员阵容(o.StartTime作为时间)='13:30:00'
然后DATEDIFF(分钟,
CAST(CAST(o.SetupStart as DATE)as DATETIME)+CAST('14:00:00'as TIME),
o、 开始时间
)

施展时(按时间开始时间)最简单的方法是@Shaker Hussain推荐的方法

DATEDIFF(MINUTE, UserData.Orders.SetupStart, UserData.Orders.StartTime)  AS[SetupTime]
变成

DATEDIFF(MINUTE, UserData.Orders.SetupStart, DATEADD(MINUTE,-30,(UserData.Orders.StartTime))) AS[SetupTime]
此外,还可以执行两个DATEDIFF函数并将它们添加到一起:

DATEDIFF(MINUTE, UserData.Orders.SetupStart, UserData.Orders.LunchStartTime)  
+ DATEDIFF(MINUTE, UserData.Orders.LunchEndTime, UserData.Orders.StartTime)  AS[SetupTime]

如果这些数据点不存在,您可以创建一个临时表。

最简单的方法是@Shaker Hussain推荐的方法

DATEDIFF(MINUTE, UserData.Orders.SetupStart, UserData.Orders.StartTime)  AS[SetupTime]
变成

DATEDIFF(MINUTE, UserData.Orders.SetupStart, DATEADD(MINUTE,-30,(UserData.Orders.StartTime))) AS[SetupTime]
此外,还可以执行两个DATEDIFF函数并将它们添加到一起:

DATEDIFF(MINUTE, UserData.Orders.SetupStart, UserData.Orders.LunchStartTime)  
+ DATEDIFF(MINUTE, UserData.Orders.LunchEndTime, UserData.Orders.StartTime)  AS[SetupTime]

如果这些数据点不存在,您可以创建一个临时表。

我相信Gordon的答案会更快,但另一个选项如下:

(编辑:只是为了好玩,在20000条记录上运行了这个,并在238毫秒内返回)


我相信Gordon的答案会更快,但另一个选择如下:

(编辑:只是为了好玩,在20000条记录上运行了这个,并在238毫秒内返回)

声明
@ldt_from time='13:00'
,@ldt_to time='14:00';
--虚拟数据准备
;将[我的设置]作为
(
选择[SetupStart]=cast('2017-01-23 13:56:42.000'作为日期时间),[StartTime]=cast('2017-01-23 14:41:06.000'作为日期时间)
联合所有
选择[SetupStart]=cast('2017-01-23 12:45:00.000'作为日期时间),[StartTime]=cast('2017-01-23 12:46:00.000'作为日期时间)
)
--结束虚拟数据准备
选择[分钟]=
datediff(mi、[SetupStart]、[StartTime])
-datediff(day,[SetupStart],[StartTime])*(datediff(mi,@ldt_-from,@ldt_-to))
+在@ldt_from和@ldt_to之间强制转换([SetupStart]作为时间)或在@ldt_from和@ldt_to then之间强制转换([StartTime]作为时间)时的情况
datediff
(
惯性矩
,cast when cast([SetupStart]as time)>@ldt\u from然后cast([SetupStart]as time)else@ldt\u from end
,case when cast([StartTime]as time)<@ldt\u然后cast([StartTime]as time)else@ldt\u结束
)
其他0结束
从…起
[我的_设置]
声明
@ldt_from time='13:00'
,@ldt_to time='14:00';
--虚拟数据准备
;将[我的设置]作为
(
选择[SetupStart]=cast('2017-01-23 13:56:42.000'作为日期时间),[StartTime]=cast('2017-01-23 14:41:06.000'作为日期时间)
联合所有
选择[SetupStart]=cast('2017-01-23 12:45:00.000'作为日期时间),[StartTime]=cast('2017-01-23 12:46:00.000'作为日期时间)
)
--结束虚拟数据准备
选择[分钟]=
datediff(mi、[SetupStart]、[StartTime])
-datediff(day,[SetupStart],[StartTime])*(datediff(mi,@ldt_-from,@ldt_-to))
+在@ldt_from和@ldt_to之间强制转换([SetupStart]作为时间)或在@ldt_from和@ldt_to then之间强制转换([StartTime]作为时间)时的情况
datediff
(
惯性矩
,cast when cast([SetupStart]as time)>@ldt\u from然后cast([SetupStart]as time)else@ldt\u from end
,case when cast([StartTime]as time)<@ldt\u然后cast([StartTime]as time)else@ldt\u结束
)