C# 1个月| |2011-03-16 | 1年| |2011-03-17 | 11个月| |2012-03-16 | 0个月| |2012-03-17 |尚未出生|

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,程序格

*参考日期为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中引入了使用
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