2015-08-04 3 views
0

Скажите, что у вас есть столбец, который содержит значения для года, месяца и даты. Можно ли получить только год? В частности, у меня естьМожет ли Postgres использовать только часть даты из поля?

ALTER TABLE pmk_pp_disturbances.disturbances_natural ADD COLUMN sdate timestamp without time zone;

и хочу просто 2004 от 2004-08-10 05:00:00. Можно ли это сделать с помощью Postgres или должен сценарий проанализировать строку? Кстати, какие-либо правила относительно того, когда «позволить базе данных выполнять работу» против того, чтобы сценарий, запущенный на локальном компьютере, выполнял работу? Я когда-то слышал, что запросы к базам данных медленнее, чем остальная часть программы, написанная на C/C++, вообще говоря.

+0

Оператор 'extract' может быть тем, что вы ищете: http://www.postgresql.org/docs/8.1/ static/functions-datetime.html – freakish

+0

Нет правил для сценария базы данных и сценария, и скорость обычно не является критерием для принятия решения. Базы данных позволяют выполнять очень сложный анализ данных, и они безопасны и позволяют одновременный доступ, если они правильно настроены. Попробуйте это с помощью скрипта python ... Так что все зависит от того, что вам нужно; для однопользовательского автономного приложения, не ходите с базой данных, поскольку все, что выходит за рамки этого, имеет хороший внешний вид. – Patrick

ответ

2

Вы можете использовать extract:

SELECT extract('year' FROM sdate) FROM pmk_pp_disturbances.disturbances_natural; 

Для многих запросов это стоит исследовать, может ли база данных выполнять преобразование данных по мере необходимости. Это, как говорится, также зависит от того, что ваше приложение будет делать с данными, поэтому это компромисс относительно того, должна ли работа работать с базой данных или в приложении.

+0

Почему вы изменили использование 'date_trunk()'? Он работал в моей программе. – Celeritas

+1

Основываясь на документации, date_trunc фактически обрезает до указанной точности. Таким образом, в общем, это не то, о чем вы просили - вы хотите, чтобы часть данных оставалась неизменной (что и есть, что делает извлечения), вы не хотите, чтобы данные были усечены/изменены Postgres. –

+0

Почему на Земле 'extract 'year'' возвращает float, а не целое число? – Celeritas

0
SELECT date_part('year', your_column) FROM your_table; 
-3

Я думаю, нет. Вы вынуждены читать все значение столбца. Вы можете разделить дату на несколько столбцов, одну на год, другую на месяц и т. Д. Или сохранить дату в целочисленном формате, если вы хотите провести агрессивную оптимизацию пространства. Но это приведет к тому, что база данных будет хуже всего масштабируемости и изменений.

Базы данных медленные, вы должны принять это, но они предлагают самые сложные вещи, связанные с C/C++.

Если вы думаете, сделайте игру и сохраните свою «сохраненную игру» на SQL, забудьте об этом. Используйте его, если вы делаете серверный сервер или приложение управления, инструмент и т. Д.

+0

Не отвечайте на вопросы, если только «думаешь так». Я знаю, что существует очень простое решение и намного лучше, чем хранение отдельных элементов даты в виде целых чисел. Базы данных также не являются «медленными» по определению, все зависит от ваших данных и того, как это и сервер организовываются. – Patrick

+0

Особенно, если быстрый поиск Google перед ответом покажет, что это легко сделать. Консультирование по делению даты на столбцы - * ужасный * совет, кстати, полная противоположность тому, что вы должны делать для эффективности и простого запроса. Кроме того, серьезно "* Базы данных медленные *". В большинстве случаев «я могу сделать это лучше в клиенте» означает, что они не знают, как правильно использовать сервер, и мне платят за то, чтобы войти и очистить последующее чудовище поезда. Попытка построить игру в основном в БД - это не отличная идея, я согласен. –

Смежные вопросы