2017-09-22 38 views
0

我有Postgres 9.6索引時間戳列與微秒。該列中的日期非常隨機。我只需要選擇在某個特定時間段內任何秒都具有最後微秒.9999的記錄(比如'2017-05-01 00:00:00'和'2017-05-02 00:00:00' )。sql選擇值的分數值等於9999

來源例如:

mydata, 2017-05-01 00:00:00.0312 
mydata, 2017-05-01 00:00:00.9431 
mydata, 2017-05-01 00:00:02.0000 
mydata, 2017-05-01 00:00:03.9999 
mydata, 2017-05-01 00:00:04.9999 
mydata, 2017-05-01 00:00:05.0793 
mydata, 2017-05-01 00:00:05.8356 

所需SQL輸出:

mydata, 2017-05-01 00:00:03.9999 
mydata, 2017-05-01 00:00:04.9999 

表是巨大的(幾十上百萬條記錄),因此性能是必不可少的。

我也可能需要查找'0000'如'2017-05-01 00:00:02.0000'的記錄,因此查詢需要足夠靈活以提供'0000'而不是'9999'查詢修改。

我不知道如何解決它並尋求你的幫助。

+0

如果你有索引 - 只是確切的價值?..你究竟做了什麼? –

+0

表格顯然有其他值。不過,我需要整個行(考慮SELECT * FROM thetable)匹配相應的時間戳。我將更新問題中的預期輸出。 – uzla

+0

那麼爲什麼不'select * FROM thetable where ts>'2017-05-01 00:00:00'和ts <'2017-05-02 00:00:00'? –

回答

1

如果我得到你的權利 - 你要像水木清華:

t=# create table thetable(d text,ts timestamp); 
CREATE TABLE 
t=# copy thetable from stdin delimiter '|'; 
Enter data to be copied followed by a newline. 
End with a backslash and a period on a line by itself. 
>> a|2017-05-01 00:00:01 
>> b| 2017-05-01 00:00:00.9999 
>> \. 
COPY 2 
Time: 33896.222 ms 
t=# with lim as (SELECT * FROM thetable where ts > '2017-05-01 00:00:00' and ts < '2017-05-02 00:00:00') select * from lim where right(ts::text,4) = '9999'; 
d |   ts 
---+-------------------------- 
b | 2017-05-01 00:00:00.9999 
(1 row) 
+0

中提供了en axample這個作品!非常感謝! – uzla

+0

我很高興,很高興我猜對了:) –

0

我認爲你可以像爲

declare @i varchar(100) 
select @i= time from (
select convert (time,getdate(),114) as time 
)as p 

select @i where SUBSTRING(@i,10,4)='9999' 

我只想說,你可以通過這個搜索時間搜索。

+0

謝謝,但它不回答這個問題,因爲它根本不返回mydata,而不是時間戳,這個答案中的表是一個字符串... :-(答案來自Vao Tsun有類似的方法,但是他對這個問題給出了完整的,正確的和有效的答案。 – uzla