【问题标题】:Order By Month in SQL Server在 SQL Server 中按月排序
【发布时间】: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


【解决方案1】:

代替

ORDER BY datepart(MM,DateName(month, DS.[Date]))

随便用

ORDER BY datepart(MM,DS.[Date])

或者

ORDER BY  MONTH(DS.[Date])

【讨论】:

  • @Jaysurya 成功了,谢谢,但您能否也请看看您是否可以为日期部分提出解决方案?
  • 如果您想按日期订购,只需使用 ORDER BY DS。[日期]
  • 不是 Order By 部分,这个工作正常。我在谈论这部分。 YEAR(DS.[Date]) = '2016' 只接受整数输入,但是当我传递任何日期时,它会抛出异常。我尝试将日期转换为整数,但尽管存在记录,但没有给出任何结果。
  • 在两边加上 year() YEAR(DS.[Date]) = YEAR(GETADTE())
  • @Jaysurya 我添加了这个,但直到给我整年的记录。它似乎没有检查字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多