SQL错误-不允许从数据类型int到日期的显式转换

时间:2018-07-10 08:28:56

标签: sql sql-server date

我有一个包含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.'

2 个答案:

答案 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