使用oracle sql的当年出生日期

时间:2018-08-15 18:58:02

标签: sql oracle

试图获取当年的出生日期。 例如,如果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;

3 个答案:

答案 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;