如何查看过去三个月在数据库中排序的建议?

时间:2012-02-26 05:52:59

标签: sql sql-server-2008-r2

我是一名新的ASP.NET开发人员,我正在尝试开发一个简单的建议框系统。我有以下部分数据库设计:

  

用户表:用户名,名称,分区代码......等

     

分部表:SapCode,Division

     

SuggestionLog表:ID,标题,描述,submittedDate,用户名

(第一个属性是每个表中的主键,属性(submittedDate)是DateTime数据类型)

现在,我需要开发一个表格,显示过去三个月的建议。我已经开发了一个查询,显示员工姓名,用户名,部门,建议标题,建议说明。我现在想要的只是展示月份。例如,要显示过去三个月的建议,月份列应显示:2012年1月,2011年12月,2011年11月那么该怎么做?

我当前的SQL查询:

SELECT     dbo.SafetySuggestionsLog.Title, dbo.SafetySuggestionsLog.Description, dbo.SafetySuggestionsType.Type, dbo.SafetySuggestionsLog.Username, 
                      dbo.employee.Name, dbo.Divisions.DivisionShortcut
FROM         dbo.Divisions INNER JOIN
                      dbo.employee ON dbo.Divisions.SapCode = dbo.employee.DivisionCode INNER JOIN
                      dbo.SafetySuggestionsLog ON dbo.employee.Username = dbo.SafetySuggestionsLog.Username INNER JOIN
                      dbo.SafetySuggestionsType ON dbo.SafetySuggestionsLog.TypeID = dbo.SafetySuggestionsType.ID

所需的输出显示:

员工姓名,用户名,分部,SuggestionTitle,SuggstionDescription,SuggestionType月(submissionDate)

1 个答案:

答案 0 :(得分:1)

我重新格式化了您的查询,因此它可以放在页面上而无需滚动。

希望这能满足您的需求。它使用DATENAME从当前日期获取月份和年份部分,并使用DATEPART进行“三个月前”计算。 请注意DATEPART的行为并不像您预期​​的那样 - 它计算了期末边界的数量(在这种情况下是几个月) - 因此条件是

...WHERE DATEDIFF(month,SafetySuggestionsLog.submittedDate,getdate()) < 3

因为过去三个月它们之间有两个月末边界。

我还添加了ORDER BY条款。

SELECT     dbo.SafetySuggestionsLog.Title, 
           dbo.SafetySuggestionsLog.Description, 
           dbo.SafetySuggestionsType.Type, 
           dbo.SafetySuggestionsLog.Username, 
           dbo.employee.Name, 
           dbo.Divisions.DivisionShortcut,
           left(datename(month,SafetySuggestionsLog.submittedDate),3) 
            + '-' 
            + datename(year,SafetySuggestionsLog.submittedDate) AS SubmittedMonth
FROM         dbo.Divisions 
INNER JOIN   dbo.employee 
ON dbo.Divisions.SapCode = dbo.employee.DivisionCode 
INNER JOIN   dbo.SafetySuggestionsLog 
ON dbo.employee.Username = dbo.SafetySuggestionsLog.Username 
INNER JOIN   dbo.SafetySuggestionsType 
ON dbo.SafetySuggestionsLog.TypeID = dbo.SafetySuggestionsType.ID
WHERE DATEDIFF(month,SafetySuggestionsLog.submittedDate,getdate()) < 3
ORDER BY SafetySuggestionsLog.submittedDate DESC

也许值得注意的是,您不必完全限定查询中所有列的名称 - 它是有效的SQL,用于对输入表进行别名,如下所示:

...INNER JOIN   dbo.SafetySuggestionsLog AS log

然后,您可以在查询中通过别名引用列名称 - 例如

log.Username

而不是

dbo.SafetySuggestionsLog.Username

这使得阅读起来更容易。