sql - 如何在我的存储过程中应用转换
问题描述
我已经看到这个问题在这里不同的时间解决了,但是我不确定在这种情况下如何应用这个转换。请参阅下面的错误消息和代码:
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围
从字符串转换日期和/或时间时转换失败。
代码:
ALTER PROCEDURE SP_Loans_to_Date
@ReportDate DATETIME
AS
BEGIN
DECLARE @DayofWeek VARCHAR(100),
@BeginofWeek DATE,
@BeginofMonth DATE,
@BeginofYear DATE
SET @DayofWeek = DATENAME(DW, @ReportDate)
SET @BeginofWeek = (SELECT
CASE
WHEN @DayofWeek = 'Sunday'
THEN DATEADD(DD, 0, @ReportDate)
WHEN @DayofWeek = 'Monday'
THEN DATEADD(DD, -1, @ReportDate)
WHEN @DayofWeek = 'Tuesday'
THEN DATEADD(DD, -2, @ReportDate)
WHEN @DayofWeek = 'Wednesday'
THEN DATEADD(DD, -3, @ReportDate)
WHEN @DayofWeek = 'Thursday'
THEN DATEADD(DD, -4, @ReportDate)
WHEN @DayofWeek = 'Friday'
THEN DATEADD(DD, -5, @ReportDate)
WHEN @DayofWeek = 'Saturday'
THEN DATEADD(DD, -6, @ReportDate)
END BeginofWeek)
SET @BeginofMonth = (SELECT
CONVERT(DATETIME, CONVERT(VARCHAR(100), DATEPART(MM, @ReportDate)) + '1'+
CONVERT(VARCHAR(100), DATEPART(YY, @ReportDate))))
SET @BeginofYear = (SELECT ('1/1' +
CONVERT(VARCHAR(100), DATEPART(YY, @ReportDate))))
SELECT
SSN, LoanDate,
CASE
WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate
THEN 'WeektoDate'
WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate
THEN 'MonthtoDate'
WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate
THEN 'YeartoDate'
ELSE NULL
END ToDate,
CASE
WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate
THEN 1
WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate
THEN 2
WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate
THEN 3
ELSE NULL
END ToDateOrder
FROM
[dbo].[Dim_Loan];
END
解决方案
我的建议是避免不必要的日期->字符串->日期转换,您可以通过这种更简单的方式获取这些值
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)
推荐阅读
- scala - 类型构造错误:Iterable[Int] 到预期类型 List[Int]
- vue.js - 无法读取未定义的属性“$notify”
- javascript - 是否可以使用带有 JSON hitboxes 的 Sprites 在 Matter.js 中创建堆栈?
- spring-boot - Springboot Embedded Tomcat 完全启动后的代码执行
- typescript - 使用 yarn 工作空间和 typescript 的项目引用来引用另一个包子目录
- sql - 仅合并源中的非空字段,目标中的其他字段保持不变
- symfony - Webpack Encore 生成正确的资产,但 Entrypoints.json 为空
- blockchain - 如何初始化 wavekeeper 对象?
- python - Python和Pandas - 按日期时间排序数据不是升序
- node.js - 如果容器处于 CrashLoopBackOff 状态,如何执行到容器并查看文件