0

日付間隔に基づいて N 行を返すクエリを作成する必要があります。それは簡単ですが、私はできません:/

基本クエリ:

SELECT
  f.many_fields
FROM
  tb_foo f
WHERE
  f.id_foo = 14

このクエリは、私の ID に基づいて 1 行を返します。しかし、このクエリに適用するために「2012-10-10」の「2012-10-30」のような日付間隔があり、最後に基本クエリは日付間隔の差分に基づいて 20 行を返します。

これを作ることは可能ですか?

SELECT
  f.many_fields,
  bar.*
FROM
  tb_foo f,
  (SELECT x FROM dual limit DATEDIFF('2012-10-10','2012-10-30')) bar
WHERE
  f.id_foo = 14

実際のクエリ:

SELECT
  m.id_matricula,
  a.nome
FROM
  tb_matricula m
    inner join tb_aluno a on (a.id_aluno = m.id_matricula)
WHERE
  m.id_matricula = 14 

開始日 = 2012-10-10 終了日 = 2012-10-30

この結果を iReport で使用して、この日付の差に基づいた行数のグリッドを作成します。

Google 検索に基づく例:

SELECT
    CONCAT( dt.d ,'-' ,days.d ) AS dates
FROM
    (
        SELECT
            CONCAT( a1 ,b1 ) AS d
        FROM
            (
                SELECT
                    '0' AS a1
            UNION ALL SELECT
                    '1'
            UNION ALL SELECT
                    '2'
            UNION ALL SELECT
                    '3'
            ) a JOIN(
                SELECT
                    '0' AS b1
            UNION ALL SELECT
                    '1'
            UNION ALL SELECT
                    '2'
            UNION ALL SELECT
                    '3'
            UNION ALL SELECT
                    '4'
            UNION ALL SELECT
                    '5'
            UNION ALL SELECT
                    '6'
            UNION ALL SELECT
                    '7'
            UNION ALL SELECT
                    '8'
            UNION ALL SELECT
                    '9'
            ) b
        WHERE
            CONVERT(
                CONCAT( a1 ,b1 ) ,
                UNSIGNED
            ) <=(
                SELECT
                    DAY(
                        CONCAT( '2012-10' ,'-01' ) + INTERVAL 1 MONTH - INTERVAL 1 DAY
                    )
            )
            AND CONCAT( a1 ,b1 ) <> '00'
    ) days JOIN(
        SELECT
            '2012-10' AS d
    ) dt
 HAVING
    dates BETWEEN '2012-10-02' AND '2012-10-05'
ORDER BY
    dates
;
4

1 に答える 1

0

これに対する解決策を見つけました。サブクエリを使用すると、日付間隔に基づいて多くの行を返すことができますが、メインクエリとは何の関係もありません。だから私はこれを持っています:

SELECT
    datas. * ,
    m.id_matricula ,
    p.nome
FROM
    tb_matricula m INNER JOIN tb_aluno a
        ON(
        a.id_aluno = m.id_aluno
    ) INNER JOIN tb_perfil p
        ON(
        p.id_perfil = a.id_perfil
    ) ,
    (
        SELECT
            CONCAT( dt.d ,'-' ,days.d ) AS dates
        FROM
            (
                SELECT
                    CONCAT( a1 ,b1 ) AS d
                FROM
                    (
                        SELECT
                            '0' AS a1
                    UNION ALL SELECT
                            '1'
                    UNION ALL SELECT
                            '2'
                    UNION ALL SELECT
                            '3'
                    ) a JOIN(
                        SELECT
                            '0' AS b1
                    UNION ALL SELECT
                            '1'
                    UNION ALL SELECT
                            '2'
                    UNION ALL SELECT
                            '3'
                    UNION ALL SELECT
                            '4'
                    UNION ALL SELECT
                            '5'
                    UNION ALL SELECT
                            '6'
                    UNION ALL SELECT
                            '7'
                    UNION ALL SELECT
                            '8'
                    UNION ALL SELECT
                            '9'
                    ) b
                WHERE
                    CONVERT(
                        CONCAT( a1 ,b1 ) ,
                        UNSIGNED
                    ) <=(
                        SELECT
                            DAY(
                                CONCAT( '2012-02' ,'-01' ) + INTERVAL 1 MONTH - INTERVAL 1 DAY
                            )
                    )
                    AND CONCAT( a1 ,b1 ) <> '00'
            ) days JOIN(
                SELECT
                    '2012-02' AS d
            ) dt
    UNION ALL SELECT
            CONCAT( dt.d ,'-' ,days.d ) AS dates
        FROM
            (
                SELECT
                    CONCAT( a1 ,b1 ) AS d
                FROM
                    (
                        SELECT
                            '0' AS a1
                    UNION ALL SELECT
                            '1'
                    UNION ALL SELECT
                            '2'
                    UNION ALL SELECT
                            '3'
                    ) a JOIN(
                        SELECT
                            '0' AS b1
                    UNION ALL SELECT
                            '1'
                    UNION ALL SELECT
                            '2'
                    UNION ALL SELECT
                            '3'
                    UNION ALL SELECT
                            '4'
                    UNION ALL SELECT
                            '5'
                    UNION ALL SELECT
                            '6'
                    UNION ALL SELECT
                            '7'
                    UNION ALL SELECT
                            '8'
                    UNION ALL SELECT
                            '9'
                    ) b
                WHERE
                    CONVERT(
                        CONCAT( a1 ,b1 ) ,
                        UNSIGNED
                    ) <=(
                        SELECT
                            DAY(
                                CONCAT( '2012-03' ,'-01' ) + INTERVAL 1 MONTH - INTERVAL 1 DAY
                            )
                    )
                    AND CONCAT( a1 ,b1 ) <> '00'
            ) days JOIN(
                SELECT
                    '2012-03' AS d
            ) dt
        ORDER BY
            dates
    ) datas
WHERE
    m.id_matricula = 42
    and
    datas.dates BETWEEN '2012-02-25' AND '2012-03-05';

ID = 42 および 3 日間の日付差に対してこのステートメントを実行すると、次のようになります。

DATES,          ID_MATRICULA, NOME
2012-02-25  42        R ANDRE F DOMINGOS
2012-02-26  42        R ANDRE F DOMINGOS
2012-02-27  42        R ANDRE F DOMINGOS
于 2012-10-30T15:28:55.500 に答える