powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Последняя дата месяца
57 сообщений из 57, показаны все 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
Последняя дата месяца
    #39911005
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка
Код: plsql
1.
 Join Таблица_с_чо_надо 




а хотелось бы без джойнов, вдруг пользователь не будет использовать параметры поиска по дате, к тому же полей по дате может быть несколько
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911006
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка
Вот эта тенденция меня и смущает. Обилие условно полезных возможностей подталкивает людей к полуумственной активности по поиску кусков чьего-то кода,


предлагаю вернуться к ассэмблеру
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911008
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаА может, так и надо? Может, в этом и есть великая сермяжная правда?

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

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

З.Ы. Сам по себе производственный календарь вещь полезная, но как по мне он должен применяться в куда более сложных случаях нежели начало и конец месяца.


О них, пользуясь календарём, можно просто забыть. Если говорить о вхождении даты в период. А если нужна информация точно на этот день и заранее не знаешь на какой, то извлечь эту дату оттуда.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911011
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11

а хотелось бы без джойнов, вдруг пользователь не будет использовать параметры поиска по дате, к тому же полей по дате может быть несколько


Ой, и не говори. От этих джойнов один гемор. Самая вредная вещь - справочник номенклатуры. Надо в каждую строку в документах вбивать названия. А то вдруг пользователь не будет использовать условие по номенклатуре.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911015
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911016
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы получить записи за месяц (текущий или прошлый, например) , то можно ж ещё так написать?

текущий месяц
Код: sql
1.
2.
3.
4.
WHERE
...
AND
 (EXTRACT(MONTH FROM MY_DATE_FIELD) = EXTRACT(MONTH FROM CURRENT_DATE)) 




предыдущий месяц
Код: sql
1.
2.
AND
 (EXTRACT(MONTH FROM MY_DATE_FIELD) = EXTRACT(MONTH FROM CURRENT_DATE) - 1)
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911031
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
предыдущий месяц


вот так правильно
Код: sql
1.
EXTRACT(MONTH FROM DATEADD(-1 MONTH TO DATE '2020-01-20'))



иначе в первом варианте будет 0, а не 12, если вычислять в январе
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911033
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
найти данные за предыдущую неделю
Код: sql
1.
EXTRACT(WEEK FROM MY_DATE_FIELD) = EXTRACT(WEEK FROM DATEADD(-1 WEEK TO CURRENT_DATE))



за текущую неделю
Код: sql
1.
EXTRACT(WEEK FROM MY_DATE_FIELD) = EXTRACT(WEEK FROM CURRENT_DATE)
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911038
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

ты уверен, что тебе нужны записи за N-ый месяц\неделю, независимо от года ?
Ты уверен, что тебя устроит полный перебор таблицы ?
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911039
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аа, этого я не учел...
спасибо
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911046
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, это тоже неправильно

если учесть, что сегодня 5 января, то
Код: sql
1.
2.
SELECT
  CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE) + (7 - EXTRACT(WEEKDAY FROM CURRENT_DATE)) AS START_DATE_OF_WEEK,



выдает 12 января вместо 30 декабря.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911089
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дата начала недели
Код: sql
1.
DATEADD(DAY, (EXTRACT(WEEKDAY FROM DATE '2020-01-10') * -1) +1, DATE '2020-01-10') AS WEEKSTART,



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

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

> З.Ы. В 4.0 ... ввели 22053491

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

всё равно неправильно, если выпадает на воскресенье
Код: sql
1.
DATEADD(DAY, (EXTRACT(WEEKDAY FROM DATE '2020-01-26') * -1) +1, DATE '2020-01-26') AS WEEKSTART3,



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

Что именно неправильно и что ты пытаешься получить?

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

Код: sql
1.
DATEADD(DAY, (EXTRACT(WEEKDAY FROM DATE '2020-01-05' - 1) * -1), DATE '2020-01-05') AS WEEKSTART4,



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


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

Это называется разница между международным и американским стандартом.
https://web.archive.org/web/20120606190207/http://volny.cz/iprenosil/interbase/ip_ib_code_timestamp.htm
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911109
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SET TERM ^ ;

CREATE OR ALTER FUNCTION GET_FIRST_DAY_OF(PERIOD STRING16, D DATE2)
RETURNS DATE2
AS
BEGIN
  IF (D IS NULL) THEN
    D = CURRENT_DATE;

  IF ((UPPER(PERIOD) = 'WEEK') OR (UPPER(PERIOD) = 'W'))  THEN
    RETURN DATEADD(DAY, (EXTRACT(WEEKDAY FROM D - 1) * -1), D);

  IF ((UPPER(PERIOD) = 'MONTH') OR (UPPER(PERIOD) = 'M'))  THEN
    RETURN D + 1 - EXTRACT(DAY FROM D);
END
^

SET TERM ; ^
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911111
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, так ты утилитарку пишешь.

Не забудь выложить сюда (и остальные тоже, если ещё есть)
окончательный вариант, когда полностью оттестируешь -
может, кому-то пригодится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911113
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Код: sql
1.
CREATE OR ALTER FUNCTION GET_FIRST_DAY_OF(PERIOD STRING16, D DATE2)


Добавлю, что STRING16 и DATE2 - это просто домены varchar(16) и Date соответственно.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911129
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдруг кому пригодится:

Код: sql
1.
2.
3.
4.
SELECT
D,  
EXTRACT( WEEKDAY FROM D)          AS AMERICAN,
EXTRACT( WEEKDAY FROM D - 1) + 1  AS ISO8601FROM T;


1=Monday, 2=Tuesday, ... 7=Sunday.
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911132
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоть бы копирайт поставил. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911158
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так общими усилиями :)
зачем там копирайт



вот вторая функция для получения даты последнего дня недели или месяца

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SET TERM ^ ;

CREATE OR ALTER FUNCTION GET_LAST_DAY_OF (PERIOD STRING16, D DATE)
RETURNS DATE
AS
BEGIN
  IF (D IS NULL) THEN
    D = CURRENT_DATE;

  IF ((UPPER(PERIOD) = 'WEEK') OR (UPPER(PERIOD) = 'W'))  THEN
    RETURN  DATEADD(DAY, 6 - MOD(EXTRACT(WEEKDAY FROM D) + 6, 7), D);

  IF ((UPPER(PERIOD) = 'MONTH') OR (UPPER(PERIOD) = 'M'))  THEN
    RETURN DATEADD(1 MONTH TO D) - EXTRACT(DAY FROM DATEADD(1 MONTH TO D));
END
^

SET TERM ; ^
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911159
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел ещё несколько, может кому пригодится, правда старый код (firebird date functions)
http://www.intitec.com/varios/Firebird_FuncionesDeFechas.pdf
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911160
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

чего уж мелочиться делай сразу PSQL-пакет DATE_UTILS и пихай в него 100500 процедур и функций для работы с датами
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911164
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

и не забыть пометить код
"-- выкинуть нахрен при переходе на ФБ 4" :-)
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911170
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

Пусть сначала релиз, наконец, выкатят.))
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911313
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
Симонов Денис,

и не забыть пометить код
"-- выкинуть нахрен при переходе на ФБ 4" :-)


года через два?
...
Рейтинг: 0 / 0
Последняя дата месяца
    #39911318
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

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


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