The data in the inventory tables should be the last data returned for the last time the inventory policy was executed that gathered that particular data class. So if you're getting old data, I'd guess you might not be running inventory on a frequent basis? Can you provide an example query where you're getting multiple rows back or historical data?
As an example, something like the following:
select v.[name] as [Computername], arp.[Name] as [Application Name], arp.Version
from vcomputer v
join Inv_AeX_OS_Add_Remove_Programs arp on v.guid = arp._resourceguid
where v.IsManaged = 1
and v.[Name] = 'Your Computer Name Here'
where you insert computername into the 'where' clause will return the most up to date add\remove programs data for that particular computer. There is no other data unless you've turned on history that I know of for that data class.
To see when this data was last returned, you can join into the resourceupdatesummary table like the following:
select v.[name] as [Computername], arp.[Name] as [Application Name], arp.Version, rus.ModifiedDate
from vcomputer v
join Inv_AeX_OS_Add_Remove_Programs arp on v.guid = arp._resourceguid
Join ResourceUpdateSummary rus on v.guid = rus.ResourceGuid
and rus.InventoryClassGuid = 'D5297E5A-F56D-4F63-A52D-5A8F7EFBE6E9' --Add Remove Programs Data Class Guid
where v.IsManaged = 1
and v.[Name] = 'Your Computer Name Here'