sql server lead - 日期问题

JJA*_*SEN 5 sql sql-server date lead

我在sql server 2012中遇到了新的主要olap函数问题.

CREATE TABLE Atext (id int, bez varchar(10), von date); 

GO

INSERT INTO Atext VALUES (1, 't1', '2001-01-01'), (1, 't2', '2012-01-01'), (2, 'a1', '2020-01-01'), (2,'a1' , '2030-01-01'), (2, 'b', '2040-05-01'), (2, 'a3', '2989-05-01'); 
GO

SELECT 
        id, 
        bez, 
        von,
        lead(von,1,0) over (partition by id ORDER BY von) -1 as bis
FROM 
        Atext
order by 
        id, 
        Von
Run Code Online (Sandbox Code Playgroud)

select查询会引发错误:

Msg 206, Level 16, State 2, Line 1 
Operand type clash: int is incompatible with date
Run Code Online (Sandbox Code Playgroud)

为什么数据类型日期时间有限制?

我知道一个解决方法,但它不是很好:

SELECT
    id,
    bez,
    CAST(vonChar AS DATE) AS Von,
    CASE
        WHEN bisChar <> '0'
        THEN (DATEADD(DAY,-1,(CAST((
                    CASE
                        WHEN bisChar <> '0'
                        THEN vonChar
                        ELSE NULL
                    END)AS DATE)) ))
        ELSE NULL /*'9999-12-31'*/
    END AS Bis
FROM
    (
        SELECT
            id,
            bez,
            vonChar ,
            lead(vonChar,1,0) over (partition BY id ORDER BY vonChar) AS bisChar
        FROM
            (
                SELECT
                    id,
                    bez,
                    CAST(von AS VARCHAR(10)) vonChar
                FROM
                    Atext) tab ) tab2
ORDER BY
    id,
    Von
Run Code Online (Sandbox Code Playgroud)

Microsoft SQL Server 2012(SP1) - 11.0.3128.0(X64)

val*_*lex 2

您可以在此查询中使用 DATEADD()。另外,数据类型的 LEAD 的默认值不能是这样0,因此我将其更改为 NULL,或者您可以使用任何 DATE 常量。

SELECT 
        id, 
        bez, 
        von,
        DATEADD(DAY,-1,lead(von,1,NULL) 
                       over (partition by id ORDER BY von)) as bis
FROM 
        Atext
order by 
        id, 
        Von
Run Code Online (Sandbox Code Playgroud)

SQLFiddle demo