【发布时间】:2018-06-20 11:13:56
【问题描述】:
; WITH DS AS
(
SELECT CAST(DATEADD(YEAR, -25, GETDATE()) AS DATE) AS [Date]
UNION ALL
SELECT DATEADD(Month, 1, [Date])
FROM DS
WHERE Date < GETDATE()-1
)
SELECT
[EI].[FirstName] + ' ' + [EI].[LastName] AS [EmployeeName],
[EI].[DOJ],
DATENAME(MONTH, DS.[Date]) AS [Month],
ISNULL(HIS.Salary, [EI].Salary) AS Salary
FROM
[HRM].[tbl_Designation] [Desig], [HRM].[tbl_Department] [Dpt], [HRM].[tbl_EmployeeInfo] [EI]
INNER JOIN
DS ON [EI].[DOJ] <= DS.[Date]
LEFT JOIN
HRM.tbl_EmployeeInfoHistory as HIS ON HIS.EmpCode = [EI].ID AND HIS.DOJ <= DS.[Date]
WHERE
[Dpt].[ID] = [EI].[DeptCode]
AND [Desig].[ID] = [EI].[DesignationCode]
AND YEAR(DS.[Date]) = '2016'
ORDER BY
DATEPART(MM, DATENAME(MONTH, DS.[Date]))
OPTION(MaxRecursion 10000)
我创建了这个查询,其中显示了每个员工的月薪以及月份名称。我无法按 1 月、2 月、3 月、...等相应的顺序对月份进行排序。
我得到的是这样的:
Muhammad Irfan 2012-02-12 May 25000.00
Muhammad Irfan 2012-02-12 April 25000.00
Muhammad Irfan 2012-02-12 January 25000.00
Muhammad Irfan 2012-02-12 March 25000.00
Muhammad Irfan 2012-02-12 February 25000.00
Muhammad Irfan 2012-02-12 September 25000.00
Muhammad Irfan 2012-02-12 August 25000.00
谁能帮我弄清楚如何以正确的方式对月份进行排序?
另外,YEAR(DS.[Date]) = '2016' 只接受整数输入,但是当我传递任何日期时,它会抛出异常。我尝试将日期转换为整数,但尽管存在记录,但没有给出任何结果。也许有人可以帮助我。
谢谢
【问题讨论】:
-
函数
year返回int并将datetime作为参数... -
@MichałTurczyn 你能编辑我的查询吗?
-
应该是
year(ds.[date]) = 2016 -
如果你想要
YEAR(DS.[Date]) = '2016',为什么你是一个生成25年日期的递归CTE? -
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 多年前),不鼓励使用。而且您应该绝对不要将这两种样式结合起来 - 选择正确的 ANSI/ISO JOIN 语法并将其用于所有您的连接!
标签: sql-server telerik telerik-reporting