powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Финансовый год
9 сообщений из 9, страница 1 из 1
Финансовый год
    #37416973
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В некоторых странах финансовый год начинается не 1 января, а 1 апреля, октября или июля. Некоторые даже начинают финансовый год не с 1-го числа, а, например, с 6-го (апреля) (UK).
Не могу придумать, как для таких случаев подвинуть календарь в учётом 29-ых и 31-вых чисел.
Т.е. имею 2 параметра. Первый месяц начала финансового года 1,2,3....12 и день начала года.
как сделать сопоставление?
Так вот считает плохо:
Код: plaintext
1.
2.
       round(strftime('%Y', CANS.TransDate, '1 month','-'||fm.infovalue||' month','-'||fd.infovalue||' day','1 day')) as FinYear,
       round(strftime('%m', CANS.TransDate, '1 month','-'||fm.infovalue||' month','-'||fd.infovalue||' day','1 day')) as FinMonth,
       round(strftime('%d', CANS.TransDate, '1 month','-'||fm.infovalue||' month','-'||fd.infovalue||' day','1 day')) as FinDay
Хорошо бы считал от начала месяца, но дневной сдвиг по фазе портит всё.
...
Рейтинг: 0 / 0
Финансовый год
    #37417024
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maximand,
а если не по частям считать (может округление собаку подкладывает) ?
Код: plaintext
strftime('%Y-%m-%d', CANS.TransDate, '1-'||fm.infovalue||' month','1-'||fd.infovalue||' day'))
...
Рейтинг: 0 / 0
Финансовый год
    #37417134
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказывается +1 month это и не месяц вовсе, а 31 день.
Код: plaintext
 select strftime ('%Y-%m-%d','2011-01-31'), strftime ('%Y-%m-%d','2011-01-31', '1 month')
возвращает 3-е марта! imho косяк серьёзный
...
Рейтинг: 0 / 0
Финансовый год
    #37417425
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
maximand,

Ровно так и документировано. Смотрим http://www.sqlite.org/lang_datefunc.html
"Thus, for example, the data 2001-03-31 modified by '+1 month' initially yields 2001-04-31, but April only has 30 days so the date is normalized to 2001-05-01."

Там же сказано, как получить первый день месяца:
Код: plaintext
1.
2.
3.
sqlite>  select date('2011-01-31', '1 month');
 2011 - 03 - 03 
sqlite>  select date('2011-01-31', '1 month', 'start of month');
 2011 - 03 - 01 
...
Рейтинг: 0 / 0
Финансовый год
    #37417432
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

Да я сразу и сказал, что если нет сдвига по дню, а только по месяцам, то проблем нет.
Как грамотно на 5 дней сдвигаться вот моя задача.
...
Рейтинг: 0 / 0
Финансовый год
    #37417437
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maximand,
не всё так плохо:
Код: plaintext
select strftime ('%Y-%m-%d','2011-01-28'), strftime ('%Y-%m-%d','2011-01-28', '1 month')
вернет как и ожидали 28-е февраля.

По теме: можно извратиться используя только разницу в днях
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
date(CANS.TransDate
    , case fm.infovalue
    when  1  then  0      /* январь */
    when  2  then - 31    /* февраль */
    when  3  then - 59    /* март. считаем, что в феврале 28 дней. поправка на високос - ниже */
    when  4  then - 90    /* апрель */
    when  5  then - 120   /* май */
    ...
    when  12  then - 334  /* декабрь */
    end || ' day'
    ,  1 -fd.infovalue || ' day'
    , case when fm.infovalue> 2  
    /* поправка на високосный год. верно в диапазоне [1901;2099] */
    then when date(CANS.TransDate,'%Y') %  4 = 0  then - 1  else  0  end
    else  0 
    end || ' day'
) as FinDate
...
Рейтинг: 0 / 0
Финансовый год
    #37418293
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stupid_BOT,

О да, это очень похоже на правду.
только обязательно надо скобки (1-fd.infovalue)||' day' иначе null возвращает.
И последовательность обратная 0,31,61,92... (декабрь, ноябрь, октябрь...)
буду проверять, спасибо.
...
Рейтинг: 0 / 0
Финансовый год
    #37419278
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё сложнее, нельзя сдвигаться по реальному календарю.
Например, в мае 31 день. Если сдвинуться на 4 месяца, то попадаем на февраль, где в лучший год набегает 29 дней.
Июль и август подряд имеют по 31-му дню!
...
Рейтинг: 0 / 0
Финансовый год
    #37420031
maximand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select transdate
, round(strftime('%d', transdate , ( 1 -fd.infovalue)||' day')) as finday
, strftime('%m', transdate ,'start of month', ((case when fd.infovalue<=round(strftime('%d', transdate )) then  1   else  0  end)-fm.infovalue)||' month') as finmonth
, strftime('%Y', transdate ,'start of month', ((case when fd.infovalue<=round(strftime('%d', transdate )) then  1   else  0  end)-fm.infovalue)||' month') as finyear
,''
    from (select '2010-01-01' as  transdate union select '2010-01-31' 
    union select '2010-02-01' union select '2008-02-29'  
    union select '2008-03-04' union select '2010-03-31'  
    union select '2010-04-01' union select '2010-04-04'  
    union select '2010-04-05' union select '2010-05-04'  
    union select '2010-05-01' union select '2010-05-31'  
    union select '2010-09-05' union select '2010-09-04'
union select '2010-09-30' ) d
left join (select  4  as infovalue) fm
left join (select  5  as infovalue) fd
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Финансовый год
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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