2015-02-05 37 views
-1

使用SQL Server中,我有以下几点:获取小时,把“天”在现场

SELECT DATENAME(DW, DATEADD(DAY, 0, @mindate)) AS Day_of_Week , 
    @crewon AS Crew_On , 
    ISNULL(SUM((CONVERT(NUMERIC(8, 2), C.FinishLength)/2000)), 0) AS Finished_Tons , 
    ISNULL(SUM(CASE WHEN C.RepairCode LIKE '%A%' 
        THEN (CONVERT(NUMERIC(8, 2), C.FinishLength) 
         /2000) 
       END), 0) AS A_Tons 
FROM NYS2SawPieces C 
WHERE RIGHT(C.ShiftIdent, 1) = @crewon 
    AND C.ProdTime >= @mindate 
    AND C.ProdTime <= DATEADD(DAY, 1, @mindate) 

我需要只是从0618并把从ProdTime“小时”“天“在列中。在该范围之外的时间将是“夜晚”。

输出会喜欢这个,但添加移位列。

Day_of_Week Crew_On Finished_Tons A_Tons  Shift  
Sunday  A  0.000000  0.0000000 Days 
+1

请编辑您的问题样本数据和预期的结果。 – 2015-02-05 13:34:53

+0

我同意Gordon的观点,不过DATEPART将成为您的解决方案,无论具体细节如何。 – 2015-02-05 13:41:07

回答

1

使用CASE语句来应用条件逻辑来确定输出:

SELECT Col1, Col2, 
    CASE WHEN DATEPART(HOUR,C.ProdTime) BETWEEN 6 AND 18 THEN 'DAYS' 
     ELSE 'NIGHTS' 
    END AS Shift 
FROM.... 

这将输出一个新列名为Shift将输出DAYS如果值是6和8之间,否则会输出NIGHTS

+0

这看起来是最有希望的,但是当我将它放入选择列表中时,出现错误:“列'NYS2SawPieces.ProdTime'在选择列表中无效,因为它不包含在聚合函数或GROUP中BY条款“。 – Obfuscated 2015-02-05 20:52:31

+0

您正在使用总和汇总,但您没有任何分组。使用sum时,select中的所有列都需要应用于它们的聚合函数(min,max,count,sum等),或者需要对它们进行分组。没有看到一些实际的来源/样本数据和期望的输出,很难提供进一步的建议。 – Tanner 2015-02-06 01:04:25

+0

绝对正确。我在一个Select语句下合并请求。当我将Day/Night查询放在一个单独的Select语句中时,效果很好。谢谢你们的帮助。 – Obfuscated 2015-02-06 17:56:56

-1

您可以使用WHEREbetween SQL命令来帮你按小时过滤查询,沿着线的东西:

WHERE hour(your_datetime_field) between 6 and 18 

WHERE充当过滤器中选择数据是在您的查询中返回。声明的其余部分给出了你想要的your_datetime_field之间的界限。

+0

您可能希望在答案中包含为什么会有所帮助的解释。你也应该阅读[this](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx)。 – Zane 2015-02-05 18:46:09

+0

我看过那篇文章,非常有帮助,但不是我所需要的。我需要从时间戳中提取一小时,以便发布该工作人员的班次(天或夜)。在Where条款中,我从移位的正确字符和ProdTime的一周中获得工作人员。 – Obfuscated 2015-02-05 20:30:50