次の 7 日間の誕生日に関するデータベースにクエリを実行する必要があります - 誕生日の日付が 2 つの列に表示されます
Name Day Month
Peter 15 8
Susi 20 8
Thor 14 9
クエリ = 次の 7 日以内に誕生日を迎える人 Return
Peter 15 - 8
Susi 20 - 8
どんな助けでも歓迎 - よろしくThorsten
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 を参照してください
@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)