powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Последняя дата месяца
25 сообщений из 57, страница 1 из 3
Последняя дата месяца
    #39910813
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вычислить дату начала недели или дату окончания недели легко, т.к. число дней в неделе постоянно.
Так же можно вычислить и дату начала месяца.
Подскажите, а как вычислить дату окончания месяца, т.е. последний день месяца? Ведь дней в месяце может быть 28, 29, 30 или 31.

Может в Firebird есть что-то типа DaysInMonth?

Код: sql
1.
2.
3.
4.
5.
SELECT
  CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE) + (7 - EXTRACT(WEEKDAY FROM CURRENT_DATE)) AS START_DATE_OF_WEEK,
  CURRENT_DATE + (7 - EXTRACT(WEEKDAY FROM CURRENT_DATE)) AS END_DATE_OF_WEEK,
  CURRENT_DATE + 1 - EXTRACT(DAY FROM CURRENT_DATE) AS START_DATE_OF_MONTH
FROM RDB$DATABASE



Firebird 3.
Спасибо.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910817
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11а как вычислить дату окончания месяца, т.е. последний день месяца?

Подсказываю: это за один день до начала следующего месяца.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910819
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: sql
1.
2.
3.
SELECT
    DATEADD(1 MONTH TO CURRENT_DATE) - EXTRACT(DAY FROM CURRENT_DATE) AS END_DATE_OF_MONTH
FROM rdb$database  
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910820
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
30-го января у тебя результат будет забавным.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910823
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

поторопился. После корректировки работает нормально

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR ALTER FUNCTION last_day_of_month (
    d DATE)
RETURNS DATE
AS
BEGIN
  RETURN DATEADD(1 MONTH TO D) - EXTRACT(DAY FROM DATEADD(1 MONTH TO D));
END



Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
    last_day_of_month(DATE '2017-01-01'),
    last_day_of_month(DATE '2017-01-30'),
    last_day_of_month(DATE '2017-01-31'),
    last_day_of_month(DATE '2017-02-22'),
    last_day_of_month(DATE '2017-12-22')
FROM rdb$database  
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910826
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. сперва мне надо добавить 32 дня к текущей дате, а потом получить месяц
Код: sql
1.
SELECT EXTRACT(MONTH FROM DATEADD (32 DAY TO CURRENT_DATE)) FROM RDB$DATABASE



потом так же получить год и всё склеить, чтобы получилось 1ое число следующего месяца.
И только потом вычесть единицу с помощью datediff?

Или я слишком замудрёно придумал?
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910827
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910835
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11

Так же можно вычислить и дату начала месяца.


Это в блокнотик. 1-е число вычислить - это задача.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910868
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
т.е. сперва мне надо добавить 32 дня к текущей дате, а потом получить месяц
Код: sql
1.
SELECT EXTRACT(MONTH FROM DATEADD (32 DAY TO CURRENT_DATE)) FROM RDB$DATABASE




потом так же получить год и всё склеить, чтобы получилось 1ое число следующего месяца.
И только потом вычесть единицу с помощью datediff?

Или я слишком замудрёно придумал?


DF=Extact(Day from D) +1 -- Первое число месяца
DL=DF+31 - Extract(Day from (DF+31)) -- Последнее число месяца
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910871
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mпотом вычесть единицу с помощью DateDiff

Только не DateDiff, а DateAdd с минусом.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910941
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не понимаю я смысла всех этих манипуляций.
1. "первое" число следующего месяца - это 01 число текущего месяца+1. Зачем вообще вычислять первое число месяца путем прибавления или вычитания количества дней куда-то там? У любого месяца всегда есть первое число.
2. в исходном вопросе про "последний день месяца". Это первый день следующего месяца минус 1 день.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910955
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

я так понимаю весь сыр бор из-за запроса типа получить статистику по текущему месяцу.
Отсюда задача получить дата начала и дату окончания месяца.

Твоё решение предполагает разложение даты на составляющие составление нового литерала даты.
Впрочем вполне себе нормальное решение.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910964
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> Отсюда задача получить дата начала и дату окончания месяца.

Зачем их получать/вычислять? Они известны до "начала" запроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910980
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Where Data>='01.01.2020' and Data<'01.02.2020'
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910981
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

ну так сперва ж нужно узнать - какой сейчас год/месяц?
а как в запросе это всё сделать и потом склеить?
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910985
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11> а как в запросе это всё сделать и потом склеить?

Дима же уже ответил как.
DateAdd(Month, 1, Твой_START_DATE_OF_MONTH)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910986
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

кому известны? Допустим надо знать статистику посещений сайта за прошлый месяц. Причём именно в формулировке "прошлый", ну или даже "текущий".
Из этих формулировок необходимо вычислить 1 число месяца и последнее/текущее. Это можно делать как на клиенте, так и на сервере, но необходимость выполнять какие-то вычисления от этого не пропадает.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910988
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
не понимаю я смысла всех этих манипуляций.
1. "первое" число следующего месяца - это 01 число текущего месяца+1. Зачем вообще вычислять первое число месяца путем прибавления или вычитания количества дней куда-то там?


Да, kdv прав, но при декабре 12+1=13 это уже не январь и год должен быть приращен при этом.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910989
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> необходимость выполнять какие-то вычисления от этого не пропадает.

Ну "это" трудно назвать вычислениями.
Впрочем, виноват, я ещё не читал топик,
когда отвечал, не знал, что всё так запущено.

AltHasp> год должен быть приращен при этом.

*facepalm*

Откройте для себя функции работы с датами,
наконец, они есть из коробки со времён 2.1.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910993
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а это будет период "предыдущий месяц"
Код: sql
1.
2.
  DATEADD(-1 MONTH TO CURRENT_DATE) + 1 - EXTRACT(DAY FROM DATEADD(1 MONTH TO CURRENT_DATE)) AS START_DATE_OF_PREVIOUS_MONTH,
  CURRENT_DATE - EXTRACT(DAY FROM CURRENT_DATE) AS END_DATE_OF_PREVIOUS_MONTH
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910995
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AFAIR, на почившем в бозе сайте Преносила
была целая подборка таких "вычислений" -
и текущий месяц, и предыдущий, и неделя,
и високосный и т.д.

Хотя щас уже не очень актуально, конечно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910996
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Гаджимурадов Рустам,

ну так сперва ж нужно узнать - какой сейчас год/месяц?
а как в запросе это всё сделать и потом склеить?


Не надо ничего в запросе ни, пардон, вычленять, ни склеивать. Не поленился запустить Эксперта, и, надо же, оказалось открыто именно оно. Следственно, я это сюда уже постил и не так давно.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
CREATE TABLE MONTHES (
    CODE    INTEGER NOT NULL,
    RSNAME  CHAR(3),
    RNAME   VARCHAR(8),
    LSNAME  CHAR(3),
    LNAME   VARCHAR(9)
);
ALTER TABLE MONTHES ADD CONSTRAINT MONTHES_PK PRIMARY KEY (CODE);
/*Заполняем 12 записей в таблице MONTHES 1 раз ручками с русскими и латинскими названиями*/

CREATE TABLE CALENDAR (
    CODEPER    INTEGER NOT NULL,
    PMONTH     INTEGER NOT NULL,
    PYEAR      INTEGER NOT NULL,
    NAME       VARCHAR(32),
    PERSTART   DATE NOT NULL,
    PEREND     DATE NOT NULL,
    DAY_COUNT  COMPUTED BY (EXTRACT(DAY FROM PerEnd - 1)),
);
ALTER TABLE CALENDAR ADD CONSTRAINT CALENDAR_PK PRIMARY KEY (CODEPER);
ALTER TABLE CALENDAR ADD CONSTRAINT CALENDAR_FKM FOREIGN KEY (PMONTH) REFERENCES MONTHES (CODE);
CREATE UNIQUE DESCENDING INDEX D_END ON CALENDAR (PEREND);
CREATE UNIQUE INDEX D_START ON CALENDAR (PERSTART);

create or alter procedure FORM_CALENDAR
as
declare variable PERSTART date;
declare variable PEREND date;
declare variable PMONTH integer;
declare variable PYEAR integer;
declare variable NMONTH integer;
declare variable NYEAR integer;
declare variable STRDATE varchar(10);
declare variable STRMONTH varchar(8);
declare variable PNAME varchar(32);
declare variable DATES date;
declare variable DATEE date;
declare variable ENOUGH integer;
Begin Enough=0;
  While (Enough=0) Do
  begin
    Select First 1 PerStart, PerEnd, PMonth, PYear From Calendar
     Order By PerStart Desc
     Into :PerStart, :PerEnd, :PMonth, :PYear;
    if (PerStart>'today'+730) then
     Enough=1;
    else
     begin
       if (PMonth=12) then
        begin PYear=PYear+1; PMonth=1; NMonth=2; NYear=PYear; end
       else
        begin PMonth=PMonth+1;
          If (PMonth=12) then
           begin NMonth=1; NYear=PYear+1; end
          else
           begin NMonth=PMonth+1; NYear=PYear; end
        end
       if (PMonth<10) then
        StrDate='0'||Cast(PMonth As Char(1));
       else
        StrDate=Cast(PMonth As Char(2));
       Select RName From Monthes Where Code=:PMonth
       Into :StrMonth;
       StrDate=StrDate||'.'||Cast(PYear As Char(4));
       PName=StrDate||' '||StrMonth;
       StrDate='01.'||StrDate;
       DateS=Cast(StrDate As TimeStamp);

       if (NMonth<10) then
        StrDate='0'||Cast(NMonth As Char(1));
       else
        StrDate=Cast(NMonth As Char(2));
       StrDate='01.'||StrDate||'.'||Cast(NYear As Char(4));
       DateE=Cast(StrDate As TimeStamp);

       Insert Into Calendar (Name, PerStart, PerEnd, PMonth, PYear)
       Values (:PName,:DateS,:DateE,:PMonth,:PYear);
     end
  end
end;
/*Вызов процедуры вструмляем в ночной крон и забываем о ней навсегда*/

/*Месячные, пардон, запросы будут выглядеть так*/
Select чо надо
From Calendar C
 Join Таблица_с_чо_надо T On T.Data>=C.PerStart And T.Data<C.PerEnd
Where C.PerStart<=Now And C.PerEnd>Now
/*+ условия по смыслу на таблицу с чо надо
   Now - частный случай, любая интересующая дата*/



На целевой таблице, естественно, нужен индекс по целевой дате. Если сделать следующий шаг оптимизации запросов такого рода, то следует задуматься о том, что вставляется запись один раз, дата либо не меняется вовсе, либо, в случае общего бардака меняется количество раз, счётное на пальцах одной руки, а вселенского бардака - двух, а читается 100500 раз, следовательно, есть смысл ввести поле ссылки на период в календаре в структуру таблиц, используемых в запросах такого рода, заполнять/менять её на триггерах этой таблицы, заглядывая в календарь, и джойнить по ней по ней с календарём в запросах, накладывая условие по дате только на календарь и делая ведущей хучь эту таблицу, хучь календарь, как там быстрее получится с учётом остальных условий.

Я не слишком длинную фразу, следуя устоявшимся в голове канонам любимого мною Фолкнера, залудил? Если да, то можно половину запятых поменять на точки и переваривать по частям.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910998
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Я не слишком длинную фразу, следуя устоявшимся в
> голове канонам любимого мною Фолкнера, залудил?
> Если да, то можно ... переваривать по частям.


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39910999
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамAFAIR, на почившем в бозе сайте Преносила
была целая подборка таких "вычислений" -
и текущий месяц, и предыдущий, и неделя,
и високосный и т.д.

те вычисления были актуальны до firebird 2.1.
Сейчас уже есть встроенные функции для всяких там, хотя порой они и выглядят длиннее.

З.Ы. В 4.0 вообще-то для начала и конца года, месяца, недели даже специальную функцию ввели 22053491
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911001
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис

те вычисления были актуальны до firebird 2.1.
Сейчас уже есть встроенные функции для всяких там, хотя порой они и выглядят длиннее.

З.Ы. В 4.0 вообще-то для начала и конца года, месяца, недели даже специальную функцию ввели 22053491


Занудный ретроград ON

Вот эта тенденция меня и смущает. Обилие условно полезных возможностей подталкивает людей к полуумственной активности по поиску кусков чьего-то кода, которые вроде бы можно попробовать применить для первого случайно забрёдшего в голову способа решения любой осмысленной задачи, вместо того, чтобы чутка раскинуть мозгами и самостоятельно найти эффективный, опирающийся на простые и вечные истины. Куда катится этот мир...

Занудный ретроград OFF

А может, так и надо? Может, в этом и есть великая сермяжная правда?
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Последняя дата месяца
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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