0

次の 7 日間の誕生日に関するデータベースにクエリを実行する必要があります - 誕生日の日付が 2 つの列に表示されます

  Name  Day   Month   
  Peter 15    8       
  Susi  20    8      
  Thor  14    9

クエリ = 次の 7 日以内に誕生日を迎える人 Return

Peter 15 - 8   
Susi  20 - 8

どんな助けでも歓迎 - よろしくThorsten

4

2 に答える 2

4

RDBMS を指定しませんでしたが、これによりSQL Serverで必要な結果が返されるはずです。これらは、テーブル内の月が現在の月よりも小さいかどうかを確認し、そうである場合は次の年を使用します。

select *
from 
(
    select name,
        cast(case 
                when datepart(month, getdate()) > [month] 
                 and datepart(day, getdate()) > [day]
                then cast(datepart(year, dateadd(year, 1, getdate())) as varchar(4))
                else cast(datepart(year, getdate()) as varchar(4)) end + '-'
            + cast([month] as varchar(2)) + '-'
            + cast([day] as varchar(2)) as datetime) bd
    from t1
) x
where datediff(day, getdate(), bd) >= 0 
  and datediff(day, getdate(), bd) < 7

デモで SQL Fiddle を参照してください

または:

select *
from 
(
    select name,
        cast(case 
        when datepart(month, getdate()) > [month] 
            and datepart(day, getdate()) > [day]
        then cast(datepart(year, dateadd(year, 1, getdate())) as varchar(4))
        else cast(datepart(year, getdate()) as varchar(4)) end + '-'
    + cast([month] as varchar(2)) + '-'
    + cast([day] as varchar(2)) as datetime) bd
    from t1
) x
where bd >= DateAdd(day, DateDiff(day, 0, getdate()), 0)
    and bd < DateAdd(day, DateDiff(day, 0, getdate()), 7)

MySQL のバージョン:

SELECT *
FROM
(
  select name,
    str_to_date(concat(case 
      when month(current_date()) > month
           and day(current_date()) > day
      then year(date_add(current_date, interval 1 year))
      else year(current_date()) 
    end, '-', month, '-', day), '%Y-%m-%d') birthdate
  from t1
) x
where birthdate >= Date(current_date())
  and birthdate < Date(Date_Add(current_date(), interval 7 day))

デモで SQL Fiddle を参照してください

于 2012-08-15T20:27:57.520 に答える
1

@bluefeet の回答から 2 番目の select ステートメントを取得すると、次のようなことができます。

select * 
from  
( 
    select name,
        case when(
         cast(cast(datepart(year, getdate()) as varchar(4)) + '-' 
        + cast([bmonth] as varchar(2)) + '-' 
        + cast([bday] as varchar(2)) as datetime) > getdate())
        THEN
            cast(cast(datepart(year, getdate()) as varchar(4)) + '-' 
            + cast([bmonth] as varchar(2)) + '-' 
            + cast([bday] as varchar(2)) as datetime)

        ELSE

            cast(cast(datepart(year, getdate())+1 as varchar(4)) + '-' 
            + cast([bmonth] as varchar(2)) + '-' 
            + cast([bday] as varchar(2)) as datetime)
        END
        as bd 
    from @Names 
) x 
where bd >= DateAdd(day, DateDiff(day, 0, GETDATE()), 0) 
    and bd < DateAdd(day, DateDiff(day, 0, GETDATE()), 7) 
于 2012-08-15T20:52:44.293 に答える