Sql server 如何使用年-月列计算年龄?

Sql server 如何使用年-月列计算年龄?,sql-server,Sql Server,我试图通过使用YRMO(年/月Ex:201606)列获取产品的年龄。我希望能够拥有产品、Yrmo和年龄,以便: Product | YrMo | Age| A | 201602 | 1 | A | 201603 | 2 | B | 201605 | 4 | 我用了这个方法,但没有得到结果 SELECT Product , YrMo , [Month_#] = DATEDI

我试图通过使用
YRMO(年/月Ex:201606)
列获取产品的年龄。我希望能够拥有产品、Yrmo和年龄,以便:

 Product  | YrMo   | Age|
 A        | 201602 |  1 |
 A        | 201603 |  2 |
 B        | 201605 |  4 |

我用了这个方法,但没有得到结果

 SELECT 
       Product      
     , YrMo
     , [Month_#]    =   DATEDIFF(MONTH,201601,YrMo) 

 FROM Table
当我使用日期类型时,它返回连续的月份:

  [Month_#] =   DATEDIFF(MONTH,'1900-01-01',YrMo)   
相反。。关于如何绕过这个问题,有什么建议吗?

简单

SELECT  Product,
        YrMo,
        DATEDIFF(month,STUFF(YrMo,5,0,'-')+'-01','2016-01-01') as Age
FROM YourTable
输出:

Product YrMo    Age
A       201602  1
A       201603  2
B       201605  4

您的查询已接近完成,但不能仅将int或6位字符串转换为日期。这是您的查询,已修改:

select 
    Product      
    , YrMo
    , [Month_#] = datediff(month, cast(cast(201601 as varchar(11)) + '01' as date), cast(cast(YrMo as varchar(11)) + '01' as date))
from Products
结果:

Product  YrMo    Month_#
A        201602  1
A        201603  2
B        201605  4

请注意,我将int转换为varchar,然后添加'01'以使其成为完整日期。根据您实际使用的数据类型,您可能会使它更漂亮。

对于“年龄”,您为什么要与2016年1月而不是当前日期进行比较?年龄是年-月列和另一个日期之间的日期差,以确定连续的月份。这在我计算给定年份的月份时非常有效,但假设我要计算从201501开始的月份?那么我会得到:201601-201501=100?而不是12个月,这是有意义的:)更改了sql server的应答您不需要破折号,YYYYMMDD中的日期文字实际上使用起来非常安全,即
DATEDIFF(month,(YrMo+'01'),'20160101')
@Swazzy您检查了我的编辑吗?这会让你在几个月内变老。@gofr1是的,我试过了,效果很好,谢谢!这有点不同,但我会把它加入阿森纳。再次感谢您的指导,您试图获取起始日期(我假设是年-月列)或另一个抽象日期和yrmo列之间的日期差?是的,这是年-月列,我想获取它和抽象日期(1900-01-01)之间的日期差,感谢您帮助我重新编写我的问题
DECLARE @T TABLE (Product VARCHAR(1), YrMo INT,  Age INT)
INSERT INTO @T VALUES
( 'A',         201602 ,  1) ,
( 'A' ,        201603 ,  2),
( 'B'  ,       201605 ,  4)


    SELECT      AGE, YRMO, 
                (YRMO / 100 * 12 +  YRMO % 100 ) - (201601 /100 *12 + 201601 % 100) AS  AGE
    FROM    @T
DECLARE @T TABLE (Product VARCHAR(1), YrMo INT,  Age INT)
INSERT INTO @T VALUES
( 'A',         201602 ,  1) ,
( 'A' ,        201603 ,  2),
( 'B'  ,       201605 ,  4)


    SELECT      AGE, YRMO, 
                (YRMO / 100 * 12 +  YRMO % 100 ) - (201601 /100 *12 + 201601 % 100) AS  AGE
    FROM    @T