Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да намеря всички интервали на стойности на клеймото за всяка минута между двата записа на клеймото в моята sql база данни

С помощта на https://stackoverflow.com/a/45992247/7616138 за генериране на поредица в MySQL побърках наоколо, за да произведе това:

Ако приемем, че вашата таблица се нарича entries , следната заявка дава резултата, който поискахте. Моля, имайте предвид, че тази заявка не е много ефективна, тъй като използва кръстосани съединения за изграждане на поредица от минути. Ако вашите интервали са по-големи, може да се наложи да удължите кръстосаните съединения.

SELECT 
    a.*, 
    DATE_ADD(DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND), INTERVAL gen_time MINUTE) AS gen_date_time
FROM 
    entries AS a
    LEFT JOIN
        (
            SELECT
                m3 * 1000 + m2 * 100 + m1 * 10 + m0 AS gen_time
            FROM
                (SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m0,
                (SELECT 0 m1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m1,
                (SELECT 0 m2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m2,
                (SELECT 0 m3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m3
            ORDER BY
                gen_time asc
        ) AS b ON (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date)
ORDER BY
    a.id,
    gen_date_time

Обяснение:

Всеки ред като SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 произвежда числата от 0 до 9. Кръстосаното свързване на няколко от тези линии заедно дава всяка възможна комбинация от тези числа. Използваме всеки ред, за да създадем конкретна цифра от броя минути, които да добавим към open_date (m3 * 1000 + m2 * 100 + m1 * 10 + m0 ). Тази поредица от минути се присъединява към таблицата със записи, като се използват само толкова минути, колкото се побират в интервала (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date ). В полето SELECT open_date се закръгля до минута (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND) ) и броят минути се добавя (DATE_ADD(..., INTERVAL gen_time MINUTE) ).

Предполагаема схема и примерни данни:

CREATE TABLE entries (
  id INT AUTO_INCREMENT PRIMARY KEY,
  open_date TIMESTAMP,
  close_date TIMESTAMP
);

INSERT INTO entries (open_date, close_date) VALUES
  ("2019-07-03 16:28:39.497", "2019-07-04 16:28:39.497"),
  ("2019-07-04 15:28:39.497", "2019-07-05 19:28:39.497");



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Трябва ли да запазя поле PRICE като int или като float int в базата данни?

  2. MySQL:Много таблици или много бази данни?

  3. Как да прехвърлите всички MySQL бази данни от стар към нов сървър

  4. Tomcat JDBC Conencton Pool + MySQL дава проблеми със счупена тръба, дори при валидиране на връзката

  5. Получаване на първия ден от седмицата в MySql с помощта на седмица №