2012-10-30 18 views
0

我需要創建一個查詢以基於日期間隔返回N行。這很簡單,但我不能夠:/MySQL根據日期間隔返回N行

的基本查詢:

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

此查詢返回基於我的ID 1列。 但是,我在'2012-10-30'上應用了這個查詢的日期間隔爲'2012-10-10',最後根據日期間隔的差異返回了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日 結束日期=二○一二年十月三十○日

我會用在iReport的這個結果建立一個網格與基於這些日期之間的差異的行數。

實例建立在谷歌搜索:

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 
; 
+1

當你說日期間隔,你兩個特定日期之間是什麼意思?你想要的結果集是什麼?添加一個你理想的輸出結果的例子。 – Ray

+1

顯示您的表格結構 – Justin

+0

當您實際上在兩個日期之間查找記錄時,「f.id_foo = 14」有什麼意義?或者那個ID值有很多記錄? – nawfal

回答

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