C# 1个月| |2011-03-16 | 1年| |2011-03-17 | 11个月| |2012-03-16 | 0个月| |2012-03-17 |尚未出生|
*参考日期为2012-03-16谢谢,我刚刚将我的C#代码转换为视图中使用的Sql函数。谢谢,我刚刚将我的C#代码转换为视图中使用的Sql函数。在Sql server management studio上执行查询时显示此错误。Msg 139,级别15,状态1,过程格式,第0行不能为局部变量指定默认值。Msg 137,15级,状态2,程序格式,第10行必须声明标量变量“@years”。Msg 139,级别15,状态1,过程格式,第0行不能为局部变量指定默认值。Msg 137,15级,状态2,程序格式,第13行必须声明标量变量“@months”。Msg 137,级别15,状态2,过程格式,第15行必须声明标量变量“@years”。SQL Server 2008中引入了使用C# 1个月| |2011-03-16 | 1年| |2011-03-17 | 11个月| |2012-03-16 | 0个月| |2012-03-17 |尚未出生|,c#,sql,C#,Sql,*参考日期为2012-03-16谢谢,我刚刚将我的C#代码转换为视图中使用的Sql函数。谢谢,我刚刚将我的C#代码转换为视图中使用的Sql函数。在Sql server management studio上执行查询时显示此错误。Msg 139,级别15,状态1,过程格式,第0行不能为局部变量指定默认值。Msg 137,15级,状态2,程序格式,第10行必须声明标量变量“@years”。Msg 139,级别15,状态1,过程格式,第0行不能为局部变量指定默认值。Msg 137,15级,状态2,程序格
declare
语句赋值。我更新了答案,将其拆分为一个单独的声明
和集
。在SQL Server 2000上进行了测试,结果似乎有效。在SQL Server management studio上执行查询时显示此错误。Msg 139,级别15,状态1,过程格式,第0行不能为局部变量指定默认值。Msg 137,15级,状态2,程序格式,第10行必须声明标量变量“@years”。Msg 139,级别15,状态1,过程格式,第0行不能为局部变量指定默认值。Msg 137,15级,状态2,程序格式,第13行必须声明标量变量“@months”。Msg 137,级别15,状态2,过程格式,第15行必须声明标量变量“@years”。SQL Server 2008中引入了使用declare
语句赋值。我更新了答案,将其拆分为一个单独的DECLARE
和SET
。在SQL Server 2000上进行了测试,结果似乎正常。查询成功执行,但存在一些不规则的值,如24年、24个月(以2012年3月17日为现在,以1987年3月20日为出生日期)查询成功执行,但存在一些不规则值,如24年、24个月(现在使用2012年3月17日,出生日期使用1987年3月20日)。这也是一个好值,但有时会给出错误答案。这也是一个好值,但有时会给出错误答案。
SELECT *,
case when DATEDIFF(MONTH, Birthday, GETDATE()) < 12
then
CONVERT(nvarchar(16), DATEDIFF(MONTH, Birthday, GETDATE())) + ' months'
else
CONVERT(nvarchar(16), DATEDIFF(YEAR, Birthday, GETDATE())) + ' years, ' +
CONVERT(nvarchar(16), DATEDIFF(MONTH, Birthday, GETDATE()) % 12 ) + ' months'
end
FROM dbo.CUSTOMER
DECLARE @tbl TABLE(birthDay DATETIME)
INSERT INTO @tbl
VALUES
('2004-04-05'),
('2001-02-05')
;WITH Years
AS
(
SELECT
DATEDIFF(yy, tbl.birthDay, GETDATE()) - CASE WHEN (MONTH(tbl.birthDay) > MONTH(GETDATE())) OR (MONTH(tbl.birthDay) = MONTH(GETDATE()) AND DAY(tbl.birthDay) > DAY(GETDATE())) THEN 1 ELSE 0 END AS Years,
tbl.birthDay
FROM
@tbl AS tbl
), BithDayWithMonth
AS
(
SELECT
Years.Years,
DATEDIFF(m, years.tmp, GETDATE()) - CASE WHEN DAY(Years.birthDay) > DAY(GETDATE()) THEN 1 ELSE 0 END AS Months
FROM
(
SELECT
DATEADD(yy, Years.Years, Years.birthDay) AS tmp,
Years.Years,
Years.birthDay
FROM
Years
) AS years
)
SELECT
(CASE WHEN BithDayWithMonth.Years=0 THEN '' ELSE CAST(BithDayWithMonth.Years AS VARCHAR(10))+' years' END)+
(CASE WHEN BithDayWithMonth.Months=0 THEN '' ELSE (CASE WHEN NOT BithDayWithMonth.Years=0 THEN ', ' ELSE '' END) +
CAST(BithDayWithMonth.Years AS VARCHAR(10))+' months' END)
FROM
BithDayWithMonth