Sql 如何在存储过程中应用转换

Sql 如何在存储过程中应用转换,sql,sql-server,ssrs-2012,Sql,Sql Server,Ssrs 2012,我在不同的时间看到这个问题得到了解决,但是我不确定如何在这种情况下应用这个转换。请参阅下面的错误消息和代码: 将varchar数据类型转换为datetime数据类型导致值超出范围 从字符串转换日期和/或时间时,转换失败 代码: 将程序SP\u Loans\u更改为\u日期 @ReportDate日期时间 作为 开始 声明@DayofWeek VARCHAR(100), @星期一开始日期, @从月日开始, @开始日期 设置@DayofWeek=DATENAME(DW,@ReportDate) 设置

我在不同的时间看到这个问题得到了解决,但是我不确定如何在这种情况下应用这个转换。请参阅下面的错误消息和代码:

将varchar数据类型转换为datetime数据类型导致值超出范围

从字符串转换日期和/或时间时,转换失败

代码:

将程序SP\u Loans\u更改为\u日期
@ReportDate日期时间
作为
开始
声明@DayofWeek VARCHAR(100),
@星期一开始日期,
@从月日开始,
@开始日期
设置@DayofWeek=DATENAME(DW,@ReportDate)
设置@BeginofWeek=(选择
案例
当@DayofWeek='Sunday'
然后添加日期(DD,0,@ReportDate)
当@DayofWeek='星期一'
然后添加日期(DD,-1,@ReportDate)
当@DayofWeek='星期二'
然后添加日期(DD,-2,@ReportDate)
当@DayofWeek='星期三'
然后添加日期(DD,-3,@ReportDate)
当@DayofWeek='星期四'
然后添加日期(DD,-4,@ReportDate)
当@DayofWeek='Friday'
然后添加日期(DD,-5,@ReportDate)
当@DayofWeek='Saturday'
然后添加日期(DD,-6,@ReportDate)
(星期三)
设置@BeginofMonth=(选择
转换(DATETIME,CONVERT(VARCHAR(100),DATEPART(MM,@ReportDate))+'1'+
转换(VARCHAR(100),DATEPART(YY,@ReportDate)))
设置@BeginofYear=(选择('1/1'+
转换(VARCHAR(100),DATEPART(YY,@ReportDate)))
挑选
SSN,Loanadate,
案例

当LoanDate>=@BeginofWeek AND LoanDate=@BeginofWeek AND LoanDate=@BeginofWeek AND LoanDate=@BeginofWeek AND LoanDate=@BeginofWeek AND LoanDate=@BeginofWeek AND LoanDate我的建议是避免不必要的日期->字符串->日期转换,您可以用这种更简单的方式获得这些值

DECLARE @DayofWeek INT,
        @BeginofWeek DATE,
        @BeginofMonth DATE,
        @BeginofYear DATE

SET @DayofWeek = DATEPART(DW, @ReportDate)
SET @BeginofWeek = DATEADD(DAY, 1 - @DayofWeek, @ReportDate)
SET @BeginofMonth = DATEFROMPARTS(YEAR(@ReportDate), MONTH(@ReportDate), 1)
SET @BeginofYear = DATEFROMPARTS(YEAR(@ReportDate), 1, 1)

我的建议是避免不必要的日期->字符串->日期转换,您可以通过这种更简单的方式获得这些值

DECLARE @DayofWeek INT,
        @BeginofWeek DATE,
        @BeginofMonth DATE,
        @BeginofYear DATE

SET @DayofWeek = DATEPART(DW, @ReportDate)
SET @BeginofWeek = DATEADD(DAY, 1 - @DayofWeek, @ReportDate)
SET @BeginofMonth = DATEFROMPARTS(YEAR(@ReportDate), MONTH(@ReportDate), 1)
SET @BeginofYear = DATEFROMPARTS(YEAR(@ReportDate), 1, 1)

1> 如果您可以提供DDL和示例数据,那么提供适当的解决方案会更容易,2>您可能想要编辑您的代码,我发现在您与@BeginofWeek进行比较的MonthToDate和YearToDate方面存在一些无意的问题,3>使用DATEDIFF和DATEADD可以很容易地计算每个类别的第一个日期,而不会使它们复杂化。1>如果您可以提供DDL和示例数据,则更容易提供适当的解决方案,2>您可能需要编辑代码,在比较MonthToDate和YearToDate时,我发现了一些无意中的问题,您正在与@BeginofWeek进行比较,3>使用DATEDIFF和DATEADD可以很容易地计算每个类别的第一个日期,而不会使它们复杂化。LifeSaver!非常感谢我会记得,向前迈进是试图把事情复杂化太多了!非常感谢我会记得,向前迈进是想把事情复杂化太多了