powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поговорим о датах
17 сообщений из 17, страница 1 из 1
Поговорим о датах
    #34670021
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброе время суток!
Продолжаю тему преобразования T-SQL в pgSQL :)

Вопрос номер один:
SET DATEFIRST 1
Этот запрос назначает первым днем недели - понедельник, по умолчанию в MS SQL этот параметр настроен на воскресение. В PostgreSQL, как я заметил, по умолчанию первый день идет понедельником, но на всякий случай - во что преобразовать этот запрос, или по крайне мере какая настройка в конфигурации за это отвечает? (смутно подозреваю, что это зависит от локали)

Вопрос второй:
В MS-SQL есть функция
DATEDIFF (стиль, Начальная_дата, Конечная_дата)
Собственно она высчитывает промежуток времени между датами и возвращает целое число
И число это не простое, оно в зависимости от параметра "стиль" может означать полное количество дней, часов и т.д. Т.е. запрос типа:
DATEDIFF (dd, '2007-01-01', '2007-01-03') вернет число 2.
В PostgreSQL разницу между датами можно вернуть при помощи операции
TIMESTAMP '2007-01-01' - TIMESTAMP '2007-01-03'
НО! Результатом опреации будет тип данных INTERVAL, а нам нужны дни и прочее.
Функция EXTRACT тут не подходит, т.к. запрос
EXTRACT (DAY FROM INTERVAL '2 years 3 months')
Вернет 0 - часть переменной INTERVAL вместо количества дней между датами.

Как быть?

Всем заранее благодарен!
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670158
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В днях
Код: plaintext
select ('2007-03-03'::date - '2007-01-01'::date)
В часах
Код: plaintext
select ('2007-03-03'::date - '2007-01-01'::date)* 24 
В месяцах не выйдет - разное количество дней.
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670177
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Количество дней в разных годах может быть разное, поэтому интервалы ИМХО следует измерять максимум в днях. Думаю, поэтому функция не возвращает количество дней в приведенном интервале.

Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670216
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточню задачу:
Работать приходится не с параметром data, а с TIMESTAMP. Т.е.
'2007-01-01 18:00:00' - '2007-02-03 20:00:00'
И разницу нужно получать как минимум в следующих видах: дни, месяцы, кварталы, годы - опционально.
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670233
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan BlackКоличество дней в разных годах может быть разное, поэтому интервалы ИМХО следует измерять максимум в днях. Думаю, поэтому функция не возвращает количество дней в приведенном интервале.

Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 


Конечно, Interval не знает точно, из каких месяцев и т.д. он был взят, поэтому вытащить из него полное количество тех же дней невозможно.
Следовательно вопрос: есть ли в Postgre функция, которая непосредственно возвращает разницу в тех же днях/месяцах/годах по выбору между двумя датами?
А если нет, то придется чесать репу и писать свою :)
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670267
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как в месяцах посчитать 60 дней? С 1-го января в 60 дней уложится 2 полных месяца, а с 1-го июля - только один (июль + август = 62 дня).
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670322
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
60 дней - это интервал, и перевести в месяцы не реально.
А вот если взять исходные данные
от '2007-01-01 18:00:00' до '2008-02-03 20:00:00'
то тут можно сказать точно, что между датами прошло 13 полных месяцев.
Вот именно такую функцию и надо, которая берет 2 даты и формат, в чем выводить разницу, а на выходе возвращает Integer
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670341
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) а сколько месяцев между 28 февраля и 31 марта? ;)
2) а сколько месяцев между 28 февраля и 30 марта? ;)
и т.д.
ИМХО слишком много тонкостей и условностей, чтобы выносить данных функционал в стандартные функции

Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670380
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, собственно, если готовой такой функции нет, то мне останется только пойти и написать ее :)

И в PostgreSQL для работы с датами функционал развит достаточно, чтобы определить количество дней между '2007-01-01 18:00:00' и '2008-02-03 20:00:00', интервалы же он считает как-то.
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670398
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, сдаюсь, накосячил, в днях не надо считать, надо в месяцах, кварталах и годах :)
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670453
_Андрей_М
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто интересно, по какому алгоритму считать?
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670474
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если задача свелась только к тому, что надо узнать месяцы/кварталы/годы, то эти данные легко вытянуть из переменной interval.
'1 year 2 months 6 hours' - полные месяцы и годы легко вычисляются :)

Всем спасибо
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670504
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZashibisНу если задача свелась только к тому, что надо узнать месяцы/кварталы/годы, то эти данные легко вытянуть из переменной interval.
'1 year 2 months 6 hours' - полные месяцы и годы легко вычисляются :)
Всем спасибо
Нет уж! Погодите :)
Код: plaintext
select '2007-01-01'::timestamp - '2005-01-07'::timestamp
как мне узнать количество полных лет в этом интервале?
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670761
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test_sql=# select age(timestamp '2007-01-01', timestamp'2005-01-07');
age
------------------------
1 year 11 mons 25 days
(1 запись)

test_sql=# select extract( YEAR from age(timestamp '2007-01-01', timestamp'2005-01-07'));
date_part
-----------
1
...
Рейтинг: 0 / 0
Поговорим о датах
    #34670921
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а слона-то я и не увидел... :)
надо будет запомнить :)

Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
Поговорим о датах
    #35325848
ignitor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кому надо - хранимка возвращает количество полных месяцев между датами

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DROP FUNCTION _diffmonth(date_begin date, date_end date);

CREATE OR REPLACE FUNCTION _diffmonth(date_begin date, date_end date)
  RETURNS integer AS
'select (case 
	when (date_part(''day'',$2)>=date_part(''day'',$1) or date_part(''day'',$2+1)=1) then 0 else -1 end
+(date_part(''year'',$2)-date_part(''year'',$1))*12
+(date_part(''month'',$2)-date_part(''month'',$1)))::integer;'
  LANGUAGE 'sql' VOLATILE;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Поговорим о датах
    #39094998
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zashibis,

спасибо
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поговорим о датах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]