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