我是一名新的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)
答案 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
这使得阅读起来更容易。