【问题标题】:How to return a list of courses between 2 months in SQL Server 2012 Management Studio?如何在 SQL Server 2012 Management Studio 中返回 2 个月之间的课程列表?
【发布时间】:2016-01-04 23:30:49
【问题描述】:

如何在 SQL Server 2012 中创建一个存储过程,返回一个运行在 2 个月之间的课程列表?

我写过这样的代码:

create procedure final_RTrainerqualification
    (@TrainerID char(10),
     @Coursecode char(4) OUTPUT,
     @qualcode nvarchar(30),
     @coursedate datetime output)

DECLARE @MinDate DATE = '20160401',
        @MaxDate DATE = '20160601';

SELECT coursedate
FROM dbo.RTrainerqualification
WHERE coursedate >= @MinDate
  AND coursedate < @MaxDate;`

它应该返回在提到的这两个日期之间运行的课程列表,但我是存储过程的新手,所以我的问题是如何将课程日期分配给课程并使其返回列表?

Edit-使用 T-SQL 重新创建代码

 @Coursecount smallint
declare @Coursedatebeg datetime, @Coursedateend datetime, @CourseCode char(4),@TrainerID char(10);
select @Coursedatebeg = '2015-04-20'
select @Coursedateend = '2015-06-20';
while @Coursedatebeg <= @Coursedateend
begin   
    select @CourseCode = @Coursedateend;
    select @Coursecount = count(*) from RCourseInstance
        where CourseCode between 'R222' and 'R224';
    if @CourseCount <> 0
        begin
            Print 'Courses running between April and June 2015 ' ;
            select Coursedate,CourseCode  from RCourseInstance as t
            inner join Coursedate as d on t.Coursedate = d.Coursedate
            inner join CourseCode as c on c.CourseCode = t.CourseCode
            where CourseCode between 'R222' and 'R224';
        end
    else    
        print 'No courses are running between these dates ' ;
    set @Coursedatebeg = @Coursedatebeg + 2;
end

It is returning the print statement but also declaring that invalid object name Coursedate 我在这里做错了什么?

【问题讨论】:

  • dbo.RTrainerqualification 是唯一涉及的表吗?其他表中是否有您需要数据的列?无需将数据分配给输出变量,您只需将 select 语句中所需的数据包含在存储过程中即可。包括 Min 和 Max 日期作为参数(不是变量)。
  • 您的问题不清楚。你想分配的课程是什么?如果您的意思是您的 OUTPUT 参数,那么 SELECT 只会将一行(最后一行)的值分配给变量(除非您使用 ORDER BY 指定 TOP 1)。要返回完整列表,您只需在 SELECT 中包含您需要的所有列。
  • 我需要返回未来 2 个月内运行的课程列表,因此日期介于 2016 年 4 月 1 日和 2016 年 6 月 1 日之间,应该返回这几个月之间教授的课程。但它显示所有日期而没有任何课程信息。我已经声明了课程代码,但是是因为它没有被分配吗?

标签: sql stored-procedures sql-server-2012


【解决方案1】:

首先,使用 ISO 日期字符串来避免区域设置问题。您只在 SELECT 中返回课程日期。如果您想了解更多信息,例如课程代码,请将其添加到 SELECT 中。即

DECLARE @MinDate DATE = '2016-04-01',
@MaxDate DATE = '2016-06-01'

SELECT coursedate, coursecode, *
FROM dbo.RTrainerqualification
WHERE coursedate >= @MinDate
AND coursedate < @MaxDate;

OUTPUT 变量不是必需的 - 当您想要返回单个值而不是列表时需要这些变量。

这是基本的 SQL 内容,因此我强烈建议您阅读此内容。有一个简单的存储过程教程here 可以开始。

【讨论】:

  • 谢谢srickt01,我确实使用了select语句(我没有在上面写过)但不幸的是它仍然打印出指定日期范围之外的值。我还检查了日期的数据类型和格式,但它仍然返回了外面的日期列表。可能必须使用选择课程代码,其中...日期在“”和“”之间,无论如何感谢您的回答和链接!
  • 回复。日期的格式。在 SQL 中指定字符串中的日期时,最好使用 ISO 标准。即'yyyy-mm-dd'。这避免了区域设置的任何问题。我已经编辑了我的答案以包括这个。然后假设 coursedate 的数据类型是 date 或 datetime 你不应该得到任何问题。如果您确实得到了意想不到的结果,您可以发布它们吗?
  • 你好,我尝试了不同的逻辑(T-SQL)但我得到错误无效的对象名称?
  • 恐怕你的 SQL 查询到处都是。对象名称错误是因为您尝试加入 CourseDate 这是一列而不是表。我认为 courseCode 是一样的。您似乎也没有在 SELECT 语句中的任何地方按日期过滤 - 仅按 CourseCode。 set @Coursedatebeg = @Coursedatebeg + 2 行增加了 2 天,这对于您想要实现的目标也毫无意义。我可以继续。很抱歉,除非您阅读一些基本的 SQL 语法和概念,否则您将非常困难。
  • 我明白你的意思。感谢您对它的关注,感谢 f/b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2021-11-10
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多