我有一个包含Year列和Month列的表。与“一月”一样,年份是INT,月份是VARCHAR。我正在创建一个报告,用户应该可以在其中简单地输入“到”和“从”日期。这是我的存储过程。
SQL
ALTER PROCEDURE [Servicing].[ManualAdjustments]
@dateFrom INT,
@dateTo VARCHAR(50)
AS
BEGIN
SELECT *
FROM MyDatabase.dbo.MyTable
WHERE RefYear BETWEEN CONVERT(DATE,YEAR(@dateFrom)) AND CONVERT(DATE,YEAR(@dateTo))
AND RefMonth BETWEEN CONVERT(DATE,MONTH(@dateFrom)) AND CONVERT(DATE,MONTH(@dateTo))
END
当我运行它时,它返回“不允许从数据类型int到日期的显式转换”。我不确定自己在语法上做错了什么。 我已经看过SO上的其他示例,但是答案仅基于发问者的问题,因此我发现很难解决如何解决我的问题。
有什么想法吗?
编辑-我尝试过的操作
1
ALTER PROCEDURE [Servicing].[ManualAdjustments]
@dateFrom DATE,
@dateTo DATE
AS
BEGIN
SELECT *
FROM MyDatabase.dbo.MyTable
WHERE RefYear BETWEEN CONVERT(DATE,YEAR(@dateFrom),0) AND @dateTo
AND RefMonth BETWEEN CONVERT(DATE,MONTH(@dateFrom),0) AND @dateTo
END
--ERROR -> 'Explicit conversion from data type int to date is not allowed.'
答案 0 :(得分:0)
此问题的正确解决方案是更改表的结构,以创建类型为RefDate
的{{1}}列。假设您无法做到这一点,那么您将不得不在存储过程中做一些棘手的事情。
但是,在存储过程中,应将Date
和@dateFrom
参数作为@dateTo
类型。
然后,您可以使用公用表表达式将月份的名称映射到月份数字(因为按字符串排序时,Date
位于February
之前),然后可以使用{{1 }}。
这样的事情应该可以解决问题:
January
答案 1 :(得分:0)
DECLARE @Year INT = 2000;
DECLARE @MONTH VARCHAR(50) = 'february';
WITH aDATE
AS (
SELECT DATEADD(year, @YEAR - 1800,'18000101') X
UNION ALL
SELECT DATEADD(month, 1, aDATE.X)
FROM aDATE
WHERE YEAR(DATEADD(month, 1, aDATE.X)) % 10 = @YEAr % 10
)
,RANGE
AS (
SELECT x MonthStart
,dateadd(day, - 1, dateadd(month, 1, x)) MonthEnd
FROM aDATE
WHERE DATENAME(month, x) = @MONTH
)
SELECT *
FROM RANGE