sql server潜在客户-日期问题
我发现sql server 2012中新的lead olap函数存在问题sql server潜在客户-日期问题,sql,sql-server,date,lead,Sql,Sql Server,Date,Lead,我发现sql server 2012中新的lead 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
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
select查询引发错误:
Msg 206, Level 16, State 2, Line 1
Operand type clash: int is incompatible with date
为什么在数据类型datetime方面存在限制
我知道一个解决方法,但不是很好:
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
Microsoft SQL Server 2012 SP1-11.0.3128.0 X64使用日期或可以隐式转换为日期的内容作为lead函数的默认值,DATEADD函数将是一个更简单的解决方法:
SELECT
id,
bez,
von,
DATEADD(DAY, -1, LEAD(von, 1, '19000101')
OVER (PARTITION BY id ORDER BY von)) AS bis
FROM Atext
ORDER BY id, Von;
或者干脆不用担心违约。不需要:
SELECT
id,
bez,
von,
DATEADD(DAY, -1, LEAD(von, 1)
OVER (PARTITION BY id ORDER BY von)) AS bis
FROM Atext
ORDER BY id, Von;
问题是不能将INT转换为日期。在SQL Server中的表达式中,表达式的所有部分都必须具有相同的数据类型,因此,如果您这样做,例如:
SELECT TOP 1 GETDATE() + number
FROM master..spt_values
WHERE type = 'p'
后台SQL Server需要决定是将GETDATE转换为整数,以便表达式的所有部分都是整数,还是将1转换为datetime,以便
所有部分都是日期时间。SQL Server规定DATETIME的优先级高于INT,因此SQL Server将1转换为DATETIME,这可以在执行计划中看到:
<ScalarOperator ScalarString="getdate()+[Expr1005]">
....
<ColumnReference Column="Expr1005" />
<ScalarOperator ScalarString="CONVERT_IMPLICIT(datetime,[master].[dbo].[spt_values].[number],0)">
这表明INT列master..spt_values.number在添加到getdate之前隐式转换为datetime
无论出于何种原因,我不久前进行了广泛的研究,没有找到任何确切的解释,因为没有从int到date的隐式或显式转换,您必须使用date函数。您可以在这个查询中使用DATEADD。此外,数据类型的LEAD的默认值不能为0,因此我已将其更改为NULL,或者您可以使用任何日期常量
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
这将对您有所帮助,错误发生在指定了0而不是预期的日期字段时
I replaced lead(von,1,0) with lead(von,1,'1900-01-01')
查看具有相同结果的其他代码
SET DATEFORMAT ymd
DECLARE @Atext TABLE
(id INT, bez VARCHAR(10), von DATE);
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', '2099-05-01');
SELECT id,
bez,
von,
lead(von,1,'1900-01-01') OVER (PARTITION BY id ORDER BY von) AS bis
FROM @Atext
ORDER by
id,
Von
结果
与所有其他答案相同,但以DATEADD作为lead的参数:
SELECT
id,
bez,
von,
lead(DATEADD(DAY,-1, von),1, null) over (partition by id order by von)
from
Atext
order by
id,
Von
范例