Как подписать и зашифровать файл с помощью ЭЦП?

30 views
Skip to first unread message

Alex S

unread,
Mar 2, 2021, 1:02:13 AM3/2/21
to ClaList
Добрый день, коллеги.
Нужно подписывать и шифровать XML файл с помощью ЭЦП. Заранее скажу, что не в теме.
Поэтому прошу совета о том в каком направлении двигаться, куда смотреть.
Не сочтите за труд дать пинка в правильном направлении.
Заранее благодарен.
С уважением, Алексей. 

Сергей Редькин

unread,
Mar 3, 2021, 5:13:07 AM3/3/21
to cla...@googlegroups.com
Ключевые слова для поиска RSA или PKI. Если нужна сертифицированная библиотека, то нужно связываться с разработчиками и покупать ее. Там будет описание и как работать.

вт, 2 бер. 2021 о 08:02 'Alex S' via ClaList <cla...@googlegroups.com> пише:
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1e7a1759-22cf-4f25-979c-45a661667058n%40googlegroups.com.


--
Best regards,
Redkin Sergey
S...@enigmasoft.com.ua

Igor Smirnov

unread,
Mar 3, 2021, 1:26:06 PM3/3/21
to cla...@googlegroups.com
Дико извиняюсь за то, что вопрос не по Клариону, но спросить, как говорится, больше некого.

Итак, есть таблица на MySQL-сервере, в которую записывается некая статистика.
Каждая запись образуется примерно раз в пару минут (именно примерно, т.к. могут быть колебания от 1 до 5 минут).
Каждой записи присваивается уникальный идентификатор - поле "RowID". Это просто счётчик, тут никаких особенностей нет.
В структуре таблицы имеется поле с именем "Time" и типом "datetime", куда записывается с точностью до секунды время получения данных.
Например, так: 2021-03-03 21:19:44
Стоит задача: создать представление (view), которое в такой же табличной структуре содержало бы записи таблицы, отобранные
по принципу "самая последняя запись запись таблицы ппо состоянию на полдень 15-го числа каждого месяца".
Для получения одиночной записи для конкретного месяца прекрасно работает вот такой запрос:

select * from mytable where (ROWID = (select max(ROWID) from mytable where (TIME <= '2021-03-15 12:00:00'))) 

Но как мы видим, в этом запросе используется конкретно указанная дата, и такой запрос возвращает одну запись.
А нужно получить табличное представление с полным списком записей, отвечающих критерию.


P.S. Еще раз напоминаю - вопрос с Кларионом не связан. Это чистый SQL.
--
С уважением,
 Igor                          
mailto:imsm...@gmail.com

Oleg Fomin

unread,
Mar 3, 2021, 2:02:28 PM3/3/21
to cla...@googlegroups.com

Вот так можно отдельно выгребать дату и время в MySQL

SELECT DATE_FORMAT(colName, '%Y-%m-%d') DATEONLY,

       DATE_FORMAT(colName,'%H:%i:%s') TIMEONLY

Igor Smirnov

unread,
Mar 3, 2021, 2:13:55 PM3/3/21
to Oleg Fomin
Здравствуйте, Oleg.

А что это мне даст? Мне нужно представлеение (view), содержащее по одной записи на каждый месяц.
Причем ещё обращаю внимание вот на что:
Из-за всяких технических проблем (не буду на них оставливаться) могут быть довольно длительные перебои с получением данных,
поэтому условие "самая свежая запись по состоянию на полдень (т.е., 12 часов дня) 15-го числа" вполне может вернуть запись,
датированную, скажем, 14-м числом и каким-нибудь временем типа 20:04:34".

Единичными SQL-запросами с указанием конкретной даты выводятся единичные записи.
И вот нужно их как-то собрать в таблицу (вернее - представление).

Вы писали 3 марта 2021 г., 22:02:23:


Вот так можно отдельно выгребать дату и время в MySQL

SELECTDATE_FORMAT(colName, '%Y-%m-%d') DATEONLY,
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
clalist+u...@googlegroups.com
.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/HE1PR0901MB143364917826CCDC9D0A6A3EB8989%40HE1PR0901MB1433.eurprd09.prod.outlook.com.

Oleg Fomin

unread,
Mar 3, 2021, 2:58:01 PM3/3/21
to cla...@googlegroups.com

> А что это мне даст?


Во-первых, в теле
WHERE можно сказать что-то подобное
CAST((DATE_FORMAT(colName, '%d') DATEONLY) AS integer) <= 15


Во-вторых, за основу курсора,
CTE или временной таблички можно взять зарос

select distinct DATE_FORMAT(colName, '%Y-%m') DATEONLY)

и конечно покурить мануал на тему курсора, CTE или временной таблички (по вкусу)

 Igor                          mailto:imsmirnov@gmail.com


--
Вы получили это сообщение, поскольку подписаны на группу "
ClaList

".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
clalist+unsubscribe@googlegroups.com.


Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке

--
Вы получили это сообщение, поскольку подписаны на группу
 "ClaList

".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
clalist+unsubscribe@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/877440579.20210303221350%40gmail.com.

Igor Smirnov

unread,
Mar 3, 2021, 3:40:43 PM3/3/21
to Oleg Fomin
Здравствуйте, Oleg.

Вы пытаетесь обсудить совершенно другую сторону вопроса.
Переформатировать дату-время в другой формат или вычленить из нее отдельно дату - такая задача вообще не стоит,
если вы внимательно прочли мое первое сообщение.
Как я уже уточнял, запись, полученная для 15-го числа, в общем случае вполне может иметь и другую (меньшую) дату.
Причем, настолько меньшую, что запись вообще может относиться к предыдущему месяцу. А предлагаемый вами
фильтр "<=15" такую запись не пропустит.
Поэтому здесь категорически нельзя рассматривать в качетве критерия отбора только дату, и тем более, число месяца.
Здесь "дата-время" должны фигурировать как единая величина, а не как отдельно год, отдельно месяц и т.д.
 
Проблема состоит в том, как создать нечто вроде LOOP, где для каждого значения даты-времени в цикле получить
RowID соответствующей записи, затем эти RowID перечислить через запятую,
а затем сделать запрос типа
select * where RowID in (xxxx, yyyy, zzzz,..) ....

Интуиция мне подсказывает, что надо написать некую хранимую процедуру для этого LOOP'а
Но дальше я начинаю тупить.

P.S. А преобразование форматов дат - это дело десятое.


Вы писали 3 марта 2021 г., 22:57:34:


 <= '2021-03-15 12:00:00'))) 
--
С уважением,
 Igor            
mailto:imsm...@gmail.com
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/HE1PR0901MB14334D90018B363A029FE78DB8989%40HE1PR0901MB1433.eurprd09.prod.outlook.com.



--
С уважением,
 Igor                          
mailto:imsm...@gmail.com

Andrew Popoff

unread,
Mar 3, 2021, 3:52:07 PM3/3/21
to Anton Novikov
Здравствуйте!

Для такой задачи нужно для начала сгенерировать таблицу, в которой будут находиться 15 числа месяцев за большой период. Далее сравнивать даты из этой таблицы и таблицы статистики. Вроде один запрос получается) 

чт, 4 мар. 2021 г., 04:26 Igor Smirnov <imsm...@gmail.com>:
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/509013785.20210303212600%40gmail.com.

Igor Smirnov

unread,
Mar 3, 2021, 4:16:11 PM3/3/21
to Andrew Popoff
Здравствуйте, Andrew.

А можно в виде SQL-запроса? Хотя бы приблизительно.

Ну вот, допустим, я создал такую таблицу (одно поле типа datetime) и набил ее датами за несколько месяцев.

select * from caldates;

2020-08-15 12:00:00
2020-09-15 12:00:00
2020-10-15 12:00:00
2020-11-15 12:00:00
2020-12-15 12:00:00
2021-01-15 12:00:00
2021-02-15 12:00:00
2021-03-15 12:00:00

А дальше-то что делать?


Вы писали 3 марта 2021 г., 23:51:53:


.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/CAHCTFtF_e%3DZfAbK7jD5AmKbRv1ZNdm_eE%3D_MQ0LeLdt%2B9P-JoQ%40mail.gmail.com.

Rimantas Nedzinskas

unread,
Mar 3, 2021, 4:26:52 PM3/3/21
to cla...@googlegroups.com
Привет,

Вот мое решение и тестовая таблица:

select * FROM test t
WHERE t.id = (SELECT MAX(t1.id) FROM test t1 WHERE DATE(t1.dt) = date(t.dt) AND time(t1.dt) <= '12:00:00')
AND DAY(t.dt) = 15
----
CREATE TABLE gstest.test (
  id int(11) NOT NULL AUTO_INCREMENT,
  dt datetime NOT NULL,
  txt varchar(20) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;

ALTER TABLE gstest.test
ADD UNIQUE INDEX UK_test_dt (dt);
----
INSERT INTO test (id, dt, txt) VALUES
(1, '2021-01-14 00:00:00', 'ss'),
(2, '2021-01-13 00:00:00', 'd'),
(3, '2021-02-01 00:00:00', 'ff'),
(4, '2021-02-11 00:00:00', 'fff'),
(5, '2021-02-09 00:00:00', 'fc'),
(6, '2021-03-02 00:00:00', 'cc'),
(7, '2021-03-01 00:00:00', 'ffx'),
(8, '2021-01-15 14:00:00', 'aa'),
(9, '2021-02-15 08:15:00', 'bb'),
(10, '2021-01-15 06:00:00', 'cc'),
(11, '2021-02-15 22:00:00', 'dd'),
(12, '2021-02-15 03:30:00', 'ee');

Римас 


Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/707042254.20210304001605%40gmail.com.

Igor Smirnov

unread,
Mar 3, 2021, 4:42:21 PM3/3/21
to Rimantas Nedzinskas
Здравствуйте, Rimantas.

Спасибо большое.
Однако тут тоже есть "прокол".
Дело в том, что записи, датированной именно 15-м числом до полудня может и не быть
(как я уже писал, из-за технических проблем могут быть "провалы" в передаче данных.
В таких случаях "рабочей" записью должна считаться самая последняя, соответствующа критерию "до полудня 15-го числа"
То есть, это может быть и запись от 14-го числа, и даже от 13-го и т.д. - лишь бы это была самая последняя запись,
созданная до полудня 15-го.
А ваш прописанный критерий "AND DAY(t.dt) = 15" такие записи будет отсекать


Вы писали 4 марта 2021 г., 0:26:39:


.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/CAOv4sAj6Aj2SGHk0%3DjDK-Bxp3tCeRZF7B7FP4uvSXCxbfEvKjA%40mail.gmail.com.

Rimantas Nedzinskas

unread,
Mar 3, 2021, 4:55:12 PM3/3/21
to cla...@googlegroups.com
Тогда так:

select * FROM test t
WHERE t.id = (SELECT MAX(t1.id) FROM test t1 WHERE year(t1.dt) = year(t.dt) AND MONTH(t1.dt) = MONTH(t.dt)
AND ((DAY(t1.dt) < 15) OR (DAY(t1.dt) = 15 AND time(t1.dt) <= '12:00:00')))

Римас 

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/1439462455.20210304004216%40gmail.com.

Igor Smirnov

unread,
Mar 3, 2021, 5:12:07 PM3/3/21
to Rimantas Nedzinskas
Здравствуйте, Rimantas.

Год и месяц тоже могут "плавать"
Например, по критерию "самая свежая до 12:00 15 января 2021 года" рабочей записью
вполне может оказаться запись, датированная "2020-30-12 19:55:15".
Поэтому закладывать критерий совпадения месяца и даже года нельзя.
Я же говорю - не надо расчленять дату-время на составные части (год, месяц, ень, час и т.д.)
Нужно дату-время рассматривать как одно число (unix_time_stamp или что-то вроде того).




.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/CAOv4sAgvWZLu1B2Z6VvYPvbRLi4FTpaNEufsB25n3ziy-ox00w%40mail.gmail.com.

Rimantas Nedzinskas

unread,
Mar 3, 2021, 8:01:39 PM3/3/21
to cla...@googlegroups.com
Ну, в таком случае действительно нужна таблица дат, к которым и надо привязываться.
Если связать таблицу caldates и мою test, то я бы писал примерно так 

SELECT c.dt, t.id, t.dt, t.txt  
FROM caldates c, test t
WHERE t.id = (SELECT MAX(t1.id) FROM test t1 WHERE t1.dt <= c.dt) 

Римас 

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/975415424.20210304011200%40gmail.com.

Alexander Strumensky

unread,
Mar 4, 2021, 1:04:41 AM3/4/21
to cla...@googlegroups.com
Народ, хватит говнокодить

Есть в скуле конструкция GROUP BY - нужно просто добавить это в изначальный запрос и группировать по году и месяцу

чт, 4 мар. 2021 г. в 00:12, Igor Smirnov <imsm...@gmail.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/975415424.20210304011200%40gmail.com.


--
Best regards,
  Strumensky Alexander

Igor Smirnov

unread,
Mar 4, 2021, 2:19:03 AM3/4/21
to Rimantas Nedzinskas
Здравствуйте, Rimantas.

А вот это работает! Огромное спасибо!
Таблицу дат можно "набить" на пару лет вперед, а дальше пользоваться вашим запросом.
Отличное решение.

 

Вы писали 4 марта 2021 г., 4:01:24:


.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/CAOv4sAg_cWpLR9WYx_T%3Dd_ctdWoJUyzbMNJ%3D8i0Vn3UGsSZy1g%40mail.gmail.com.

Rimantas Nedzinskas

unread,
Mar 4, 2021, 3:22:56 AM3/4/21
to cla...@googlegroups.com
Александр,

Насколько я понял задачу, GROUP BY тут не подходит. Возможно я что-то упустил, т.к. решал поздно ночью. Поделись примером, пожалуйста. Интересно.

Римас 

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAJ4HZHtQBvLyGT1nVVpPF_1TxTxnvo-WzHRw8wk%2BqDq9BjVVRQ%40mail.gmail.com.

Alexander Strumensky

unread,
Mar 4, 2021, 11:21:11 AM3/4/21
to cla...@googlegroups.com
Как-то так

select * from mytable where ROWID IN ( select max(ROWID) from mytable where DAY(TIME) < 15 OR (DAY(TIME) = 15 AND TIME(TIME) <= '12:00:00') ORDER BY YEAR(TIME) , MONTH(TIME) , DAY(TIME)  GROUP BY  YEAR(TIME) , MONTH(TIME) )

Конкретно синтаксис может отличаться от скуля к скулю, но сама идея такова

чт, 4 мар. 2021 г. в 10:22, Rimantas Nedzinskas <r40...@gmail.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAOv4sAh92S99w_N9gu5bN8219EZAMYx48G9MueuMsff_jAxU4w%40mail.gmail.com.

Igor Smirnov

unread,
Mar 4, 2021, 12:51:36 PM3/4/21
to Alexander Strumensky
Здравствуйте, Alexander.

У вас тут опять привязка не к моменту времени, а отдельно к числу, отдельно к месяцу, отдельно к году и отдельно к часам.
Ваш запрос предполагает, что заведомо существует хотя бы одна запись, датированная 15-м числом заданного месяца и имеющая време до полудня.
Но такой запись в базе может и не быть! И последней записью, соответствующей критерию поиска может стать запись и за вчерашнее число, и за позавчерашнее, и за прошлый месяц, и даже за прошлый год.
А вы пытаетесь найти ее строго в диапазоне прошедшимх полусуток, и ни секундой ранее.
Преставьте себе ситуацию.
Например последние данные пришли 31 декабря 2020 года в 23:34:55. После этого данные в базу не поступали вплоть до 13 часов 15 января 2021 года (стояли жуткие морозы, и инфракрасный приёмник
не смог правильно декодировать поступающие сигналы).
И как вы с вашим запросом отловите эту прошлогоднюю запись по заданному условию "самая свежая запись до 12 часов 15 января 2021 года"? А она ведь по условиям задачи должна "отловиться".
И можно хоть стопятьсот раз группировать полученные данные, но толк-то от этого какой, если запрос по сути неточен?
Да и порядок (order) записей нет смысла отдельно задавать - они и так сортированы естественным образом, потому что "набивались" в базу хронологически.


Вы писали 4 марта 2021 г., 19:21:00:


.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/CAJ4HZHsUNSJk_QxZ6o4nBKfoZV1dYi5UQsve-OK%2B6J34NUw9oA%40mail.gmail.com.

Alexander Strumensky

unread,
Mar 4, 2021, 1:07:12 PM3/4/21
to cla...@googlegroups.com


чт, 4 мар. 2021 г. в 19:51, Igor Smirnov <imsm...@gmail.com>:
Здравствуйте, Alexander.

У вас тут опять привязка не к моменту времени, а отдельно к числу, отдельно к месяцу, отдельно к году и отдельно к часам.
Ваш запрос предполагает, что заведомо существует хотя бы одна запись, датированная 15-м числом заданного месяца и имеющая време до полудня.

Вы не разобрались в запросе, если внимательно посмотрите - то там или до 15го числа любое время, или 15го до полудня
 
Но такой запись в базе может и не быть! И последней записью, соответствующей критерию поиска может стать запись и за вчерашнее число, и за позавчерашнее, и за прошлый месяц, и даже за прошлый год.
А вы пытаетесь найти ее строго в диапазоне прошедшимх полусуток, и ни секундой ранее.
Преставьте себе ситуацию.
Например последние данные пришли 31 декабря 2020 года в 23:34:55. После этого данные в базу не поступали вплоть до 13 часов 15 января 2021 года (стояли жуткие морозы, и инфракрасный приёмник
не смог правильно декодировать поступающие сигналы).
И как вы с вашим запросом отловите эту прошлогоднюю запись по заданному условию "самая свежая запись до 12 часов 15 января 2021 года"? А она ведь по условиям задачи должна "отловиться".
И можно хоть стопятьсот раз группировать полученные данные, но толк-то от этого какой, если запрос по сути неточен?

Мне абсолютно наплевать, как Вы будете группировать записи, это ваша проблема (можно добавить или отнять 15 дней и группировать тупо по ГОДУ и ДНЮ нового значения), я просто дал идею как это решается. А Вы уже пытаетесь заставить меня решать вашу задачу. Извините, это Ваша задача, а не моя :))))))))
 
Да и порядок (order) записей нет смысла отдельно задавать - они и так сортированы естественным образом, потому что "набивались" в базу хронологически.

В скуле нет естественной хронологической сортировки, порядок выдачи - как придется, а если у Вас в нужном порядке идет - то это случайное совпадение, либо особенности конкретного движка БД. Можете в будущем на грабельки наступить без ORDER BY
 
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/352222974.20210304205130%40gmail.com.

Igor Smirnov

unread,
Mar 4, 2021, 1:18:56 PM3/4/21
to Alexander Strumensky
Здравствуйте, Alexander.

ОК, давайте разбираться. Вот ваш запрос:

select * from mytable where ROWID
IN ( select max(ROWID) from mytable where DAY(TIME) < 15 OR (DAY(TIME) = 15 AND TIME(TIME) <= '12:00:00') ORDER BY YEAR(TIME) , MONTH(TIME) , DAY(TIME)  GROUP BY  YEAR(TIME) , MONTH(TIME) )
А теперь кусок из него:

where DAY(TIME) < 15 OR (DAY(TIME) = 15 AND TIME(TIME) <= '12:00:00')
В переводе на русский язык это означает:
те записи, где число месяца меньше 15, или те записи, где число месяца 15-е, но время до полудня.
Согласны?
Так разве вашим запросом может быть отобрана запись, датированная 30-м числом прошлого месяца?
Сами ответьте.

Да, задача действительно моя, а не ваша, но раз уж вы проявили интерес и приняли участие, то давайте обсуждать, а не обижаться и кричать, что вам плевать и т.д., и т.п.

P.S. Насчет нужного порядка. Если вы считаете естественный порядок случайным совпадением, то у меня есть еще и RowID, который увеличивается на единицу с каждой внесенной записью.
И ордерить по RowID значительно удобнее, чем по сложной конструкции "год-месяц-число".
И более того - в таблице есть готовое поле типа "datetime", по которому (будете смеяться) тоже можно неплохо сортировать. И в чем тогда состоит великий смысл "расчленения" datetime
на отдельно год, месяц и т.д. я, увы, не погу понять.



Вы писали 4 марта 2021 г., 21:07:00:


.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/CAJ4HZHuE9WHCHfLW1p_2jgCV5Yfs04T-VjLisc9G_9nf-5Ub3A%40mail.gmail.com.

Alexander Strumensky

unread,
Mar 4, 2021, 1:40:54 PM3/4/21
to cla...@googlegroups.com


чт, 4 мар. 2021 г. в 20:18, Igor Smirnov <imsm...@gmail.com>:
Здравствуйте, Alexander.

ОК, давайте разбираться. Вот ваш запрос:
select * from mytable where ROWID IN ( select max(ROWID) from mytable where DAY(TIME) < 15 OR (DAY(TIME) = 15 AND TIME(TIME) <= '12:00:00') ORDER BY YEAR(TIME) , MONTH(TIME) , DAY(TIME)  GROUP BY  YEAR(TIME) , MONTH(TIME) )
А теперь кусок из него:
where DAY(TIME) < 15 OR (DAY(TIME) = 15 AND TIME(TIME) <= '12:00:00')
В переводе на русский язык это означает:
те записи, где число месяца меньше 15, или те записи, где число месяца 15-е, но время до полудня.
Согласны?
Так разве вашим запросом может быть отобрана запись, датированная 30-м числом прошлого месяца?
Сами ответьте.

У меня нет времени здесь ни обижаться, ни препираться здесь. Я дал вам подсказку для решения Вашей задачи - решайте.
 
Да, задача действительно моя, а не ваша, но раз уж вы проявили интерес и приняли участие, то давайте обсуждать, а не обижаться и кричать, что вам плевать и т.д., и т.п.

P.S. Насчет нужного порядка. Если вы считаете естественный порядок случайным совпадением, то у меня есть еще и RowID, который увеличивается на единицу с каждой внесенной записью.
И ордерить по RowID значительно удобнее, чем по сложной конструкции "год-месяц-число".
И более того - в таблице есть готовое поле типа "datetime", по которому (будете смеяться) тоже можно неплохо сортировать. И в чем тогда состоит великий смысл "расчленения" datetime
на отдельно год, месяц и т.д. я, увы, не погу понять.

Сортируйте как Вам угодно, но некоторые движки требуют для GROUP BY соответствующую сортировку, т.к. это вам по RowID значительно удобнее, а движок (будете смеяться) и не догадывается, что он почти совпадает с сортировкой по "datetime"

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

За сим откланиваюсь, отвечать больше не буду, ибо своей работы дохренища.

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/31752928.20210304211850%40gmail.com.

Alex

unread,
Mar 4, 2021, 5:06:06 PM3/4/21
to cla...@googlegroups.com, Alexander Strumensky

04.03.2021, в 19:51, Igor Smirnov <imsm...@gmail.com> написал(а):

Здравствуйте, Alexander.

У вас тут опять привязка не к моменту времени, а отдельно к числу, отдельно к месяцу, отдельно к году и отдельно к часам.
Ваш запрос предполагает, что заведомо существует хотя бы одна запись, датированная 15-м числом заданного месяца и имеющая време до полудня.
Но такой запись в базе может и не быть! И последней записью, соответствующей критерию поиска может стать запись и за вчерашнее число, и за позавчерашнее, и за прошлый месяц, и даже за прошлый год.

А за позапрошлый год может?

Best regards,
Alexander

Igor Smirnov

unread,
Mar 5, 2021, 12:02:39 AM3/5/21
to Alex
Здравствуйте, Alex.

Если вопрос задан серьезно, а не из-за желания "поумничать", то отвечаю: на практике вряд ли, но в общем случае да.

Вы писали 5 марта 2021 г., 1:06:01:




04.03.2021, в 19:51, Igor Smirnov <imsm...@gmail.com> написал(а):


Re: {ClaList:13134} Вопрос по SQL-запросам и представлениям Здравствуйте, Alexander.


У вас тут опять привязка не к моменту времени, а отдельно к числу, отдельно к месяцу, отдельно к году и отдельно к часам.
Ваш запрос предполагает, что заведомо существует хотя бы одна запись, датированная 15-м числом заданного месяца и имеющая време до полудня.
Но такой запись в базе может и не быть! И последней записью, соответствующей критерию поиска может стать запись и за вчерашнее число, и за позавчерашнее, и за прошлый месяц, и даже за прошлый год.
А за позапрошлый год может?

Best regards,
Alexander
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес
clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/BCB34B7D-60D8-4EF5-AF1B-84F6D452D2E6%40gmail.com.

Александр Агеев

unread,
Mar 5, 2021, 5:27:11 AM3/5/21
to cla...@googlegroups.com
Здравствуйте,
Поделюсь малость опытом и рассуждениями.
Во-первых, в каждой моей базе есть таблица zz_Numbers, где лежат инты от 0 до 100000. Пока хватает. За 30 лет выходить за пределы не приходилось. Кроме примари ключа есть обратный (desc ID). Кто не в курсе - просмотр "назад" по ключу в общем случае намного медленнее чем просмотр "вперед". Поэтому 2 ключа по любому полю где может быть нужен просмотр "назад" - это необходимость.

Посему рекомендую сделать обратные ключи и по дате, и по ID в "главной" таблице.

Во-вторых, я бы не стал делать выдачу по тем записям, в которых в их периоде нет нужных записей. Т.е. если последняя искомая запись датирована позапрошлым годом - она повторится 13+ раз. Если действительно необходимо - тогда вместо view лучше сделать table-функцию и в ней заполнить пропуски.

Ну а по конкретно задаче:
делаем селект по  zz_Numbers, генерируем 2 datetime - начала и конца периода (от некоей "начальной" даты вперед до ближайшего 15 числа 12:00)
если есть записи BETWEEN этих дат - выдаем max ID, хотя мой опыт подсказывает, что надо все-таки выдавать по последнему моменту (top 1 ID from .. Where date = (select max(date) ...).
Остальное как в оригинале.

пт, 5 мар. 2021 г. в 12:02, Igor Smirnov <imsm...@gmail.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/919053379.20210305080233%40gmail.com.

Вячеслав Черников

unread,
Mar 5, 2021, 6:37:34 AM3/5/21
to clalist

пт, 5 мар. 2021 г., 13:27 Александр Агеев <alexande...@gmail.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/clalist/CAPdikDDsVTLCGQn4kLWe2Nq8p61_doanHpbxSWAVQ1GWY8j0Kg%40mail.gmail.com.
VID-20201231-WA0017.mp4

POLOVINKIN Sergey

unread,
Mar 5, 2021, 6:41:45 AM3/5/21
to cla...@googlegroups.com

Извините, если уже решено и это Оракл, но смысл я думаю понятен ADD_MONTHS функция добавления месяца к дате,

 я просто решил вспомнить как это делается-интересно стало(бывает:))

Исходные данные:

Id            DateTime

2             2021-01-13 00:00:00

1             2021-01-14 00:00:00

10           2021-01-15 06:00:00

8             2021-01-15 14:00:00

3             2021-02-01 00:00:00

5             2021-02-09 00:00:00

4             2021-02-11 00:00:00

12           2021-02-15 03:30:00

9             2021-02-15 08:15:00

11           2021-02-15 22:00:00

7             2021-03-01 00:00:00

6             2021-03-02 00:00:00

13           2021-05-15 12:30:00

14           2021-08-15 11:59:00

 

WITH s AS (SELECT ADD_MONTHS (TRUNC (SYSDATE, 'Y'), LEVEL - 1) rmonth

              FROM DUAL

        CONNECT BY LEVEL <= (TO_NUMBER(SUBSTR(TO_CHAR(SYSDATE,'MM/YYYY'),1,2)))+12

)

SELECT s.rmonth+ 14.5 rmonth, to_char((SELECT MAX(dt) dt FROM test WHERE dt<s.rmonth+ 14.5),'yyyy-mm-dd hh24:mi:ss') dt

  FROM s

ORDER BY s.rmonth

 ;

 

Я задал период с начала года и плюс год вперед…

 

Дата 15                               DateTime

15.01.2021 12:00:00        2021-01-15 06:00:00

15.02.2021 12:00:00        2021-02-15 08:15:00

15.03.2021 12:00:00        2021-03-02 00:00:00

15.04.2021 12:00:00        2021-03-02 00:00:00

15.05.2021 12:00:00        2021-03-02 00:00:00

15.06.2021 12:00:00        2021-05-15 12:30:00

15.07.2021 12:00:00        2021-05-15 12:30:00

15.08.2021 12:00:00        2021-08-15 11:59:00

15.09.2021 12:00:00        2021-08-15 11:59:00

15.10.2021 12:00:00        2021-08-15 11:59:00

15.11.2021 12:00:00        2021-08-15 11:59:00

15.12.2021 12:00:00        2021-08-15 11:59:00

15.01.2022 12:00:00        2021-08-15 11:59:00

15.02.2022 12:00:00        2021-08-15 11:59:00

15.03.2022 12:00:00        2021-08-15 11:59:00

 

С уважением Сергей

 

From: cla...@googlegroups.com [mailto:cla...@googlegroups.com] On Behalf Of Igor Smirnov


Sent: Wednesday, March 03, 2021 10:26 PM
To: cla...@googlegroups.com

Вопрос по SQL-запросам и представлениям

--

Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес

clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
https://groups.google.com/d/msgid/clalist/509013785.20210303212600%40gmail.com.

Reply all
Reply to author
Forward
0 new messages