Which Ubuntu versions are supported?
JavaScript (ES6), 552 bytes
d=&gt;(d=d.replace(/^20|-/g,'')*1,[for(r of'41020,60430;50408,61031;51013,70413;-60601,90714,110601;61026,80425;70419,81019;71018,90418;-80424,110512,130509;81030,100430;90423,101023;-91029,110430;-100429,130509,150430;101010,120410;110428,121028;111013,130509;-120426,170426;121018,140516;130425,140127;131017,140717;-140417,190430;141023,150723;150423,160131;151022,160731;-160421,210430'.split`;`.map(a=&gt;a.split`,`))if(d&gt;=(a=Math.abs(f=r[0]))&amp;&amp;((m=d&lt;=r[1])||r[2]&amp;&amp;d&lt;=r[2]))((a+'').slice(-6,-2)/100).toFixed(2)+'LTS'.slice(f)+(m?'':'-server')].join`, `)

Building the data array takes up ~68% of the total size. The rest is input formatting, array lookup, and output string construction.
The data string is split into an array of arrays of either 2 (normal) or 3 (server) length. The dates are reduced to numeric format, with the intial &quot;20&quot; stripped (along with any leading zeroes after that). LTS is denoted by a negative start date. Version numbers can be conveniently derived from all but the last two digits of the positive start date, divided by 100.