Как выбрать строки в таблице postgres на основе даты и сохранить ее в новой таблице? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть таблица postgres, в которой есть некоторые данные. Каждая строка имеет дату, связанную с ней. Я хочу извлечь строки для дат, в которых месяц является апрелем. Вот версия csv моих данных из таблицы postgres

,date,location,device,provider,cpu,mem,load,drops,id,latency,gw_latency,upload,download,sap_drops,sap_latency,alert_id
0,2018-02-10 11:52:59.342269+00:00,BEM,10.11.100.1,COD,6.0,23.0,11.75,0.0,,,,,,,,
1,2018-02-10 11:53:04.006971+00:00,VER,10.11.100.1,KOD,6.0,23.0,4.58,0.0,,,,,,,,
2,2018-03-25 20:28:36.186015+00:00,RET,10.11.100.1,POL,7.0,26.0,9.83,0.0,,86.328,5.0,4.33,15.33,0.0,23.0,
3,2018-03-25 20:28:59.155453+00:00,ASR,10.12.100.1,VOL,5.0,14.0,2.67,0.0,,52.406,12.0,2.17,3.17,0.0,28.0,
4,2018-04-01 13:16:44.472119+00:00,RED,10.19.0.1,SEW,6.0,14.0,2.77,0.0,,52.766,2.0,3.25,2.29,0.0,1.0,0.0
5,2018-04-01 13:16:48.478708+00:00,RED,10.19.0.1,POL,6.0,14.0,4.065,0.0,,52.766,1.0,6.63,1.5,0.0,1.0,0.0
6,2018-04-06 21:00:44.769702+00:00,GOK,10.61.100.1,FDE,4.0,22.0,3.08,0.0,,54.406,8.0,3.33,2.83,0.0,19.0,0.0
7,2018-04-06 21:01:07.211395+00:00,WER,10.4.100.1,FDE,3.0,3.0,9.28,0.0,,0.346,2.0,10.54,8.02,0.0,33.0,0.0
8,2018-04-13 11:18:08.411550+00:00,DER,10.19.0.1,CVE,14.0,14.0,7.88,0.0,,50.545,2.0,6.17,9.59,0.0,1.0,0.0
9,2018-04-13 11:18:12.420974+00:00,RTR,10.19.0.1,BOL,14.0,14.0,1.345,0.0,,50.545,1.0,2.26,0.43,0.0,1.0,0.0

Итак, я хочу только те строки, которые имеют данные за апрель, так что у меня будет таблица, которая выглядит примерно так

4,2018-04-01 13:16:44.472119+00:00,RED,10.19.0.1,SEW,6.0,14.0,2.77,0.0,,52.766,2.0,3.25,2.29,0.0,1.0,0.0
5,2018-04-01 13:16:48.478708+00:00,RED,10.19.0.1,POL,6.0,14.0,4.065,0.0,,52.766,1.0,6.63,1.5,0.0,1.0,0.0
6,2018-04-06 21:00:44.769702+00:00,GOK,10.61.100.1,FDE,4.0,22.0,3.08,0.0,,54.406,8.0,3.33,2.83,0.0,19.0,0.0
7,2018-04-06 21:01:07.211395+00:00,WER,10.4.100.1,FDE,3.0,3.0,9.28,0.0,,0.346,2.0,10.54,8.02,0.0,33.0,0.0
8,2018-04-13 11:18:08.411550+00:00,DER,10.19.0.1,CVE,14.0,14.0,7.88,0.0,,50.545,2.0,6.17,9.59,0.0,1.0,0.0
9,2018-04-13 11:18:12.420974+00:00,RTR,10.19.0.1,BOL,14.0,14.0,1.345,0.0,,50.545,1.0,2.26,0.43,0.0,1.0,0.0

Теперь, если я пытаюсь извлечь конкретную дату с помощью запроса ниже

select * from metrics_data where date = 2018-04-13;

Я получаю сообщение об ошибке

No operator matches the given name and argument type(s). You might need to add explicit type casts.

Как мне получить строки за апрель месяц и сохранить их в новой таблице, скажем april_data?

Ниже приведена структура моей существующей таблицы

   Column    |           Type           | Modifiers | Storage  | Stats target | Description 
-------------+--------------------------+-----------+----------+--------------+-------------
 date        | timestamp with time zone |           | plain    |              | 
 location    | character varying(255)   |           | extended |              | 
 device      | character varying(255)   |           | extended |              | 
 provider    | character varying(255)   |           | extended |              | 
 cpu         | double precision         |           | plain    |              | 
 mem         | double precision         |           | plain    |              | 
 load        | double precision         |           | plain    |              | 
 drops       | double precision         |           | plain    |              | 
 id          | integer                  |           | plain    |              | 
 latency     | double precision         |           | plain    |              | 
 gw_latency  | double precision         |           | plain    |              | 
 upload      | double precision         |           | plain    |              | 
 download    | double precision         |           | plain    |              | 
 sap_drops   | double precision         |           | plain    |              | 
 sap_latency | double precision         |           | plain    |              | 
 alert_id    | double precision         |           | plain    |              | 

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Тип столбца date в вашей таблице - timestamp with time zone, формат которого будет YYYY:MM:DD HH24:MI:SS.MS. В запросе вы делаете операцию timestamp with time zone = date, поэтому она выдаст ошибку.

Итак, если вы хотите исправить это, вы должны зафиксировать одну сторону по типу другой.

В вашем случае я предлагаю следующее:

  1. Точный матч 1 день.

    select * from metrics_data where date(date) = '2018-04-13';

  2. Матч в течение 1 месяца.

    select * from metrics_data where date BETWEEN '2018-04-01 00:00:00' AND '2018-04-30 23:59:59.999';

    OR

    select * from metrics_data where date(date) BETWEEN '2018-04-01' AND '2018-04-30';

    OR

    select * from metrics_data where to_char(date,'YYYY-MM') = '2018-04';

  3. Только матч April.

    select * from metrics_data where to_char(date,'MM') = '04';

    OR

    select * from metrics_data where extract(month from date) = 4;

Надеюсь, этот ответ поможет вам.

0 голосов
/ 07 мая 2018

Вам нужны одинарные кавычки вокруг строкового литерала.
PostgreSQL автоматически приведёт его к правильному типу данных (timestamp with time zone).

Вы можете использовать функцию extract для выбора только дат с апреля:

SELECT * FROM yourtable WHERE extract (month FROM yourtable.date) = 4;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...