table query

t1:( ts: time$(); sym: $())

insert[t1;(08:30:00.422;GOOG)]

insert[t1;(08:30:01.522;GOOG)]

insert[t1;(08:30:03.702;GOOG)]

b: select ts: (string[second$ts],":",string[int$mod[ts;1000]]) from t1

q)b

ts        


“08:30:00”

“08:30:01”

“08:30:03”

“:”       

“422”     

“522”     

“702”     

Expected


ts        


“08:30:00:422”

“08:30:01:522”

“08:30:03:702”

What is going on? This should be such a simple construct. Why do I have to spend 2 hours on this?

q)t1:( ts: time$(); sym: $())

q)insert[t1;(08:30:00.422;GOOG)]

,0

q)insert[t1;(08:30:01.522;GOOG)]

,1

q)insert[t1;(08:30:03.702;GOOG)]

,2

q)t1

ts           sym


08:30:00.422 GOOG

08:30:01.522 GOOG

08:30:03.702 GOOG

q)select ts: (string[second$ts],'":",'string[int$mod[ts;1000]]) from t1

ts


“08:30:00:422”

“08:30:01:522”

“08:30:03:702”

Thanks Rory

You’d be better off string-search-replacing than trying to concatenate.

q)select ssr’[;“.”;“:”]string ts from t1

ts


“08:30:00:422”

“08:30:01:522”

“08:30:03:702”

q)

A slightly quicker solution (given that the position of the dot is fixed) would be

q)select .[;(::;8);:;“:”]string ts from t1

ts


“08:30:00:422”

“08:30:01:522”

“08:30:03:702”

Terry

Thanks Terry
Can you please elaborate on the syntax 

select ssr’[;“.”;“:”]string ts from t1

Why do I need to use ’ (each-both) ?

I am assuming ssr is applied to each row and not after all the rows are returned.

E.g.

q)a:08:30:00.422

q)ssr[string a;“.”;“:”]

“08:30:00:422”

q)b:(08:30:00.422 09:10:00.123)

q)ssr’[string b;“.”;“:”]

“08:30:00:422”

“09:10:00:123”

Thanks

Correct, ssr has to be applied to each string (which is a list of lists).

To clarify - ssr is the slowest solution but the easiest to read and most succinct. If speed is a concern you should use the dot-indexing approach.

In my syntax below i deliberately projected the ssr function (left the first param blank) to force the column name to be parsed correctly. It could also have been written

select ts:ssr’[string ts;“.”;“:”] from t1

Or

select ts:{ssr[x;“.”;“:”]}each string ts from t1

Etc. Was just trying to shave some characters!

Terry

In the case that the dot is not fixed - the following solution from Igor is ~10x quicker that ssr’.

q)show t1:(ts:100000?08:30:00.0)
ts

03:37:12.823
00:53:18.265
05:50:34.147
..

q)c2p:{p:ss[r:raze x;“.”];r[p]:“:”;(0,-1_sums count’)_r}    / http://stackoverflow.com/a/38916772/2039505

q)\t a:select ts:ssr’[string ts;“.”;“:”] from t1
404
q)\t b:select c2p string ts from t1
43
q)a~b
1b

Connor