按DateName排序在SQL中不起作用

时间:2015-09-23 13:04:55

标签: sql sql-server tsql group-by datepart

我正在计算每个员工每月的工作总时数。

以下是我使用的代码:

SELECT 
    emp_name, 
    emp_id, 
    monthval = DATENAME( month, Pdate), 
    Total_Time = (CAST(SUM(DATEDIFF(MI, In_Punch, Out_Punch))/60 as varchar)            
           + ':' +  right('00'+ cast(SUM(DATEDIFF(MI, In_Punch, Out_Punch))%60 as varchar), 2)) 
FROM masterprocessdailydata 
WHERE Emp_Id = @EmpID 
GROUP BYEmp_Name,Emp_ID, DATENAME(month, Pdate)

除了显示的月份顺序不同之外,它的工作正常。

此查询按字母顺序排列列。

输出

April, December, February, January,July and so on...

预期输出:

January, February, March...

由于我想要月份名称作为输出,我不能使用 - DATEPART(月,Pdate)

有没有办法将 monthname 转换为 monthvalue ,仅用于分组目的? 或者我必须完全更改查询吗?

2 个答案:

答案 0 :(得分:0)

只需添加订单并在结果中添加其他列(抱歉,之前忘记了该部分)。由于DatePart和DateName函数具有相似的一致性,因此不会影响结果的生成方式:

SELECT emp_name, emp_id, Datepart(month, Pdate), monthval = DATENAME( month, Pdate) , Total_Time =    (CAST(SUM(DATEDIFF(MI, In_Punch, Out_Punch))/60 as varchar) + ':' +  right('00'+ cast(SUM(DATEDIFF(MI, In_Punch, Out_Punch))%60 as varchar), 2)) 
  from masterprocessdailydata 
  Where Emp_Id = @EmpID 
  group by Emp_Name,Emp_ID, Datepart(month, Pdate), DATENAME(month, Pdate)
  order by Datepart(month, Pdate)

答案 1 :(得分:0)

此查询有效:

SELECT emp_name, emp_id, Datepart(month, Pdate), 
monthval = DATENAME( month, Pdate) ,DATENAME( month, Pdate),
 Total_Time =    (CAST(SUM(DATEDIFF(MI, In_Punch, Out_Punch))/60 as varchar) + ':' +  right('00'+ cast(SUM(DATEDIFF(MI, In_Punch, Out_Punch))%60 as varchar), 2)) 

 from masterprocessdailydata 
 Where Emp_Id = @EmpID 
 group by Emp_Name,Emp_ID, Datepart(month, Pdate), DATENAME(month, Pdate)
 order by Datepart(month, Pdate)

谢谢!