|
|
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Всем доброе время суток! Продолжаю тему преобразования 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 вместо количества дней между датами. Как быть? Всем заранее благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 13:24 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
В днях Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 13:47 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Количество дней в разных годах может быть разное, поэтому интервалы ИМХО следует измерять максимум в днях. Думаю, поэтому функция не возвращает количество дней в приведенном интервале. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 13:51 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Уточню задачу: Работать приходится не с параметром data, а с TIMESTAMP. Т.е. '2007-01-01 18:00:00' - '2007-02-03 20:00:00' И разницу нужно получать как минимум в следующих видах: дни, месяцы, кварталы, годы - опционально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 13:57 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Dan BlackКоличество дней в разных годах может быть разное, поэтому интервалы ИМХО следует измерять максимум в днях. Думаю, поэтому функция не возвращает количество дней в приведенном интервале. Код: plaintext 1. Конечно, Interval не знает точно, из каких месяцев и т.д. он был взят, поэтому вытащить из него полное количество тех же дней невозможно. Следовательно вопрос: есть ли в Postgre функция, которая непосредственно возвращает разницу в тех же днях/месяцах/годах по выбору между двумя датами? А если нет, то придется чесать репу и писать свою :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:00 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
А как в месяцах посчитать 60 дней? С 1-го января в 60 дней уложится 2 полных месяца, а с 1-го июля - только один (июль + август = 62 дня). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:06 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
60 дней - это интервал, и перевести в месяцы не реально. А вот если взять исходные данные от '2007-01-01 18:00:00' до '2008-02-03 20:00:00' то тут можно сказать точно, что между датами прошло 13 полных месяцев. Вот именно такую функцию и надо, которая берет 2 даты и формат, в чем выводить разницу, а на выходе возвращает Integer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:14 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
1) а сколько месяцев между 28 февраля и 31 марта? ;) 2) а сколько месяцев между 28 февраля и 30 марта? ;) и т.д. ИМХО слишком много тонкостей и условностей, чтобы выносить данных функционал в стандартные функции Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:18 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Ну, собственно, если готовой такой функции нет, то мне останется только пойти и написать ее :) И в PostgreSQL для работы с датами функционал развит достаточно, чтобы определить количество дней между '2007-01-01 18:00:00' и '2008-02-03 20:00:00', интервалы же он считает как-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:24 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Ладно, сдаюсь, накосячил, в днях не надо считать, надо в месяцах, кварталах и годах :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:28 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Просто интересно, по какому алгоритму считать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:39 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Ну если задача свелась только к тому, что надо узнать месяцы/кварталы/годы, то эти данные легко вытянуть из переменной interval. '1 year 2 months 6 hours' - полные месяцы и годы легко вычисляются :) Всем спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:43 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
ZashibisНу если задача свелась только к тому, что надо узнать месяцы/кварталы/годы, то эти данные легко вытянуть из переменной interval. '1 year 2 months 6 hours' - полные месяцы и годы легко вычисляются :) Всем спасибо Нет уж! Погодите :) Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 14:51 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 15:46 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
а слона-то я и не увидел... :) надо будет запомнить :) Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2007, 16:22 |
|
||
|
Поговорим о датах
|
|||
|---|---|---|---|
|
#18+
Если кому надо - хранимка возвращает количество полных месяцев между датами Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 13:24 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35325848&tid=1997658]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 504ms |

| 0 / 0 |
