Have you looked at the type of fields in the metadata?
For me, the INTEGER type (4) is returned for ID, and the BIGINT type (-5) is returned for %ID.

Try

SELECT idxyFROM some_table order by %id

and

rs.%GetMetadata().%Display()

What are the default values for AdaptiveMode, AllowRowIDUpdate, IdKeyCPF, PKEY_IS_IDKEY ?

Try disabling AdaptiveMode.

There is a faster way without opening the object:

Class dc.test Extends %Persistent
{

ClassMethod Test()
{
  
  classname="dc.test"storagename="Default"
  w $$$defMemberKeyGet(classname,$$$cCLASSstorage,storagename,$$$cSDEFdatalocation)
}

Storage Default
{
<Data name="testDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
</Data>
<DataLocation>^abc.1</DataLocation>
<DefaultData>testDefaultData</DefaultData>
<IdLocation>^dc.testD</IdLocation>
<IndexLocation>^dc.testI</IndexLocation>
<StreamLocation>^dc.testS</StreamLocation>
<Type>%Library.CacheStorage</Type>
}

}

Result:

^abc.1

Here are two ways:

s="12162,CHAPTER I,Certain infectious and parasitic diseases (A00-B99),003 (A20-A28),Certain zoonotic bacterial diseases,A28,""Other zoonotic bacterial diseases, not elsewhere classified"",A28,""Other zoonotic bacterial diseases, not elsewhere classified"",N,N,N,N,N,,,,,,,,,,G"
##class(%DeepSee.TermList).%ParseCSVRecord(s,.arr1)
zw arr1

!

list=$$CSVtoList^%occLibrary(s)

##class(%ListOfDataTypes).BuildValueArray(list,.arr2)
zw arr2


Take a look at the class methods %SQL.Util.Procedures

If there was a built-in function for expanding the list into a table, then the solution would be even shorter.

 
An example of such a function:

Now you can do a variety of things with the string, for example:

select min(length(word)) "min",length(wordlen,word from dc_golf.Kata_split('bitcoin take over the world maybe who knows perhaps',' ')

Result:

min len word
3 7 bitcoin
3 4 take
3 4 over
3 3 the
3 5 world
3 5 maybe
3 3 who
3 5 knows
3 7 perhaps

There are no such methods, because the size of the stream (file) can exceed the maximum length of the string, which at the moment is 3641144, so the type of string (%String, %VarString, %xsd.base64Binary, etc.) will not always be able to hold all the data.

But also it is not difficult to read the stream into a line:

ClassMethod StreamToStr(ByRef stream As %Stream.ObjectAs %String
{
  s=""
  stream.Rewind()
  while 'stream.AtEnd {
    s=s_stream.Read($$$MaxLocalLength)
  }
  s
}

PS: above I have given methods, some of which are available in older versions of Caché.

..
sql=0
sql($i(sql))="select *"
sql($i(sql))=",%external(DOB)||' '||%external(DOBTime) DOBString"
sql($i(sql))=",TO_CHAR(DOB||','||DOBTime,'MM/DD/YYYY HH24:MI:SS') DOBString2"
sql($i(sql))="from dc.test"
st.%ExecDirect(.st,.sql).%Display()
..

Result:

USER>##class(dc.test).Test()

ID
(INTEGER)
DOB
(DATE)
DOBTime
(TIME)
DOBString
(VARCHAR)
DOBString2
(VARCHAR)
1 01.01.2020 23:59:59 01.01.2020 23:59:59 01/01/2020 23:59:59
2 31.12.2022 10:10:10 31.12.2022 10:10:10 12/31/2022 10:10:10

I like @Yaron Munz version better

Class dc.test Abstract ]
{

ClassMethod Test()
{
  v=0,
    v($i(v))=$lb("2021-11-27","2022-08-04"),
    v($i(v))=$lb("2020-02-28","2023-02-27"),
    v($i(v))=$lb("2020-02-28","2023-03-01"),
    v($i(v))=$lb("2017-03-01","2020-02-28")
    
  i=1:1:$o(v(""),-1) {
    d1 $li(v(i),1),
      d2 $li(v(i),2),
      age1 $e(d2,1,4)-$e(d1,1,4)-($e(d1,6,10)]$e(d2,6,10)),
      age2 $number($zabs($zdh(d2,3)-$zdh(d1,3))/365.25,0),
      age3 $zdh(d2,3)-$zdh(d1,3)\365.25
      
    d1," ",d2," (age1 = ",age1,", age2 = ",age2,", age3 = ",age3,")",!
  }
}

}

Result:

USER>##class(dc.test).Test()
2021-11-27 2022-08-04 (age1 = 0, age2 = 1, age3 = 0)
2020-02-28 2023-02-27 (age1 = 2, age2 = 3, age3 = 2)
2020-02-28 2023-03-01 (age1 = 3, age2 = 3, age3 = 3)
2017-03-01 2020-02-28 (age1 = 2, age2 = 3, age3 = 2)

A simple example of combining:

Class dc.test Extends %Persistent
{

Property DOB As %Date;

Property DOBTime As %Time;

ClassMethod Test()
{
  ..%KillExtent()
  
  &sql(insert into dc.test(DOB,DOBTime)
    select {'2020-01-01'},{'23:59:59'}
    union all
    select {'2022-12-31'},{'10:10:10'})
  
  st=##class(%SQL.Statement).%New()
  st.%SelectMode=2
  
  sql=5
  sql(1)="select *"
  sql(2)=",%odbcout(DOB)||' '||%odbcout(DOBTime) DOBString"
  sql(3)=",CAST(%odbcout(DOB)||' '||%odbcout(DOBTime) as DATETIME) DOBDateTime"
  sql(4)=",UNIX_TIMESTAMP(DOB||','||DOBTime) DOBUnixTimeStamp"
  sql(5)="from dc.test"
  st.%ExecDirect(.st,.sql).%Display()
}

}

Result:

USER>##class(dc.test).Test()

ID
(INTEGER)
DOB
(DATE)
DOBTime
(TIME)
DOBString
(VARCHAR)
DOBDateTime
(TIMESTAMP)
DOBUnixTimeStamp
(NUMERIC)
1 01.01.2020 23:59:59 2020-01-01 23:59:59 2020-01-01 23:59:59 1577923199.00
2 31.12.2022 10:10:10 2022-12-31 10:10:10 2022-12-31 10:10:10 1672481410.00
2 Rows(s) Affected

Instead of two separate fields, it would be easier to use the %TimeStamp (or %PosixTime) type, where the date and time are paired at once.
For this type of data, you can make your own indexes for different parts and/or combinations of them: a separate date, a separate time, a separate year, a separate year and month, etc.
You can also use these separate parts in the query (in SELECT and WHERE).

select datediff('yy',DOB,current_dateAge from yourtable