sql >> データベース >  >> RDS >> Oracle

SQL-結果がない日付の入力

    それらを作成する方法に応じて、カレンダーテーブル を作成できます。 または、Oracle connect byを使用して行を動的に生成します 構文。

    with the_dates as (
      select max(trunc(Create_Dtime)) as max_date
           , min(trunc(Create_Dtime)) as min_date
        from player 
             )
      , generator as (
      select min_date + level as the_date
        from the_dates
     connect by level <= max_date
             )
    select g.the_date, count(trunc(p.Create_Dtime))
      from generator g
      left outer join player p
        on g.the_date = trunc(p.Create_Dtime)
     group by g.the_date
     order by g.the_date desc
    

    カレンダーテーブルオプションを下げると、少しきれいになります:

    with the_dates as (
      select max(trunc(Create_Dtime)) as max_date
           , min(trunc(Create_Dtime)) as min_date
        from player 
             )
    select c.the_date, count(trunc(p.Create_Dtime))
      from calender c
      join the_dates td
        on c.the_date between td.min_date and td.max_date
      left outer join join player p
        on c.the_date = trunc(p.Create_Dtime)
     group by c.the_date
     order by c.the_date
    

    または、日付の制約に気付いたばかりです:

    with the_dates as (
      select to_date('07-05-2012','dd-mm-yyyy') + level as the_date
        from dual
     connect by level <= trunc(to_date('07-05-2012','dd-mm-yyyy') - sysdate)
             )
     select td.the_date, count(trunc(p.create_dtime))
       from the_dates td
       left outer join player p
         on td.the_date = trunc(p.create_dtime)
      group by td.the_date
      order by td.the_date
    

    これらすべてについて、trunc(create_dtime)のインデックスをお勧めします playerで テーブル。




    1. NodeJSとmysql:クエリ結果を待つ

    2. SQLiteクライアントデータベースとMySQLサーバーデータベースの同期

    3. C#DateTimeMySQLコマンド

    4. ランキング位置を保存するためのMySQL更新ステートメント