Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本年度';使用oracle sql记录出生日期_Sql_Oracle - Fatal编程技术网

本年度';使用oracle sql记录出生日期

本年度';使用oracle sql记录出生日期,sql,oracle,Sql,Oracle,正在尝试获取当前年份中的出生日期。 例如,如果DOB=19800925,则当年的出生日为20180925 (注:由于闰年DOB(例如20000229),我们不应仅替换年份) 这一逻辑应该起作用: with tmp_dob as ( select to_date('19900101', 'YYYYMMDD') as Birthday from dual union all select to_date('19901231', 'YYYYMMDD') Birthday fro

正在尝试获取当前年份中的出生日期。 例如,如果DOB=19800925,则当年的出生日为20180925 (注:由于闰年DOB(例如20000229),我们不应仅替换年份)


这一逻辑应该起作用:

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,
       add_months(birthday, 12 * (extract(year from sysdate) - extract(year from birthday)))
from tmp_dob;

这一逻辑应该起作用:

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,
       add_months(birthday, 12 * (extract(year from sysdate) - extract(year from birthday)))
from tmp_dob;

我考虑过使用字符串的方法,因为您使用的生日也是字符串。 我使用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;

我考虑过使用字符串的方法,因为您使用的生日也是字符串。 我使用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;

“添加月数”方法有效,但闰日生日将获得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;

考虑制作一个函数来做同样的事情-您的查询将更容易阅读。

添加月份方法可行,但闰日生日将得到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;

考虑创建一个函数来做同样的事情-您的查询将更容易阅读。

那么,为什么您不能直接替换年份呢?那么就为闰年生日创建特殊处理?如何处理非闰年在02-29出生的人?他们的生日在02-28或03-01?我的期望是,当前年份-02-28您的期望也是Oracle
add_months()
函数的工作方式,如Gordon的回答所示。然而,请注意,对于法律决定(例如,何时允许驾驶?),一些国家将在非闰年使用2月28日,而其他国家则使用3月1日。正确的处理方法取决于你的查询将如何/在何处使用。那么,你为什么不能直接替换年份呢?那么就为闰年生日创建特殊处理?如何处理非闰年在02-29出生的人?他们的生日在02-28或03-01?我的期望是,当前年份-02-28您的期望也是Oracle
add_months()
函数的工作方式,如Gordon的回答所示。然而,请注意,对于法律决定(例如,何时允许驾驶?),一些国家将在非闰年使用2月28日,而其他国家则使用3月1日。正确的处理方法取决于查询的使用方式/位置。不需要检查年份是否可以被4整除。不需要检查年份是否可以被4整除。