试图获取当年的出生日期。 例如,如果DOB = 19800925,则当年的出生日期是20180925 (注意:我们不应该只因为year年DOB(例如20000229)而替换年份)
with tmp_dob as
(
select '19900101' Birthday from dual union all
select '19901231' Birthday from dual union all
select '20040229' Birthday from dual union all
select '20041231' Birthday from dual union all
select '20171231' Birthday from dual union all
select '20051231' Birthday from dual
)
select Birthday,add_months(to_date(Birthday,'YYYYMMDD'),(trunc(months_between(sysdate ,to_date(Birthday,'YYYYMMDD'))/12)) * 12) current_year_dob
from tmp_dob;
答案 0 :(得分:4)
此逻辑应该起作用:
#include <SDL.h>
#include <stdio.h>
namespace SDL2
{
class Window
{
private:
SDL_Window* mWindow;
int ScreenWidth = 640;
int ScreenHeight = 480;
public:
Window()
{
mWindow = SDL_CreateWindow( "Breakout", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, ScreenWidth, ScreenHeight, SDL_WINDOW_SHOWN );
}
~Window()
{
SDL_DestroyWindow( mWindow );
}
SDL_Window* GetWindow()
{
return mWindow;
}
};
class Surface
{
private:
SDL_Surface* mSurface;
public:
Surface( SDL2::Window& window )
{
mSurface = SDL_GetWindowSurface( window.GetWindow() );
}
void FillRect()
{
SDL_FillRect( mSurface, NULL, SDL_MapRGB( mSurface->format, 0xFF, 0x00, 0xFF ) );
}
void Update( SDL2::Window& window )
{
SDL_UpdateWindowSurface( window.GetWindow() );
}
};
}
int main( int argc, char** argv )
{
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
return 1;
}
SDL2::Window window = SDL2::Window();
SDL2::Surface surface = SDL2::Surface( window );
surface.FillRect();
surface.Update( window );
SDL_Delay( 2000 );
return 0;
}
答案 1 :(得分:1)
添加数月的方法有效,但but日生日将获得2/28的收益。如果您希望将其设置为03/01或可配置,请使用案例来检测情况并覆盖:
with tmp_dob as (
select to_date('19900101', 'YYYYMMDD') as Birthday from dual union all
select to_date('19901231', 'YYYYMMDD') Birthday from dual union all
select to_date('20040229', 'YYYYMMDD') Birthday from dual union all
select to_date('20041231', 'YYYYMMDD') Birthday from dual union all
select to_date('20171231', 'YYYYMMDD') Birthday from dual union all
select to_date('20051231', 'YYYYMMDD') Birthday from dual
)
select Birthday,
case
when
to_date(extract(year from sysdate) || '1231', 'YYYYMMDD') -
to_date(extract(year from sysdate) || '0101', 'YYYYMMDD') < 365
and to_char(birthday, 'MMDD') = '0229' then
to_date(extract(year from sysdate) || '0301', 'YYYYMMDD')
else
add_months(birthday, 12 * (extract(year from sysdate) - extract(year from birthday)))
end as bd_this_year
from tmp_dob;
结果:
BIRTHDAY BD_THIS_YEAR
1/1/1990 1/1/2018
12/31/1990 12/31/2018
2/29/2004 3/1/2018
12/31/2004 12/31/2018
12/31/2017 12/31/2018
12/31/2005 12/31/2018
考虑使函数执行相同的操作-您的查询将更易于阅读。
答案 2 :(得分:-1)
我考虑过使用字符串方法,因为您使用的生日也是字符串。 我使用BigQuery语法,但每个SQL中应该都有类似的功能。
with tmp_dob as
(
select '19900101' Birthday from dual union all
select '19901231' Birthday from dual union all
select '20040229' Birthday from dual union all
select '20041231' Birthday from dual union all
select '20171231' Birthday from dual union all
select '20051231' Birthday from dual
)
select Birthday,
CASE WHEN MOD(CAST(SUBSTR(Birthday,1,4) AS INT64), 4) = 0 AND SUBSTR(Birthday,5,8) = '0229'
THEN CONCAT(CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS STRING), '0228')
ELSE CONCAT(CAST(EXTRACT(YEAR FROM CURRENT_DATE) AS STRING), SUBSTR(Birthday,5,8)) END AS bd
from tmp_dob;