Oracle中的有效日期检查

时间:2013-02-05 07:15:57

标签: oracle date

我有一个varchar格式的日期值(有效日期或无效日期)商店。是否可以在sql查询中检查日期是否有效。

6 个答案:

答案 0 :(得分:6)

是的,如果您知道格式并且只需要很少的plsql。

假设您的日期格式为'yyyy-mon-dd hh24:mi:ss'

create function test_date(d varchar2) return varchar2
is
  v_date date;
begin
  select to_date(d,'yyyy-mon-dd hh24:mi:ss') into v_date from dual;
  return 'Valid';
  exception when others then return 'Invalid';
end;

现在你可以:

select your_date_col, test_date(your_date_col)
from your_table;

答案 1 :(得分:4)

您可以在

这样的块中执行此操作
BEGIN
  select TO_DATE(your_date,'YYYYMMDD') from dual; --ADD INTO V_DUMMY IN PLSQL
EXCEPTION WHEN OTHERS THEN dbms_output.put_line('NOT A VALID DATE');
END;

答案 2 :(得分:2)

不使用块或创建自定义函数或过程,只需使用下面的select语句,它就会返回从日期字符串解析的真实日期值,如果无法识别日期字符串,则返回null。

这种方法有局限性。请参阅下面的说明。

select
  case
    when regexp_substr(DateStr,'^[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}$') is not null then
      case
        when to_number(regexp_substr(DateStr,'[^-]+',1,1))<=12 and to_number(regexp_substr(DateStr,'[^-]+',1,2))<=31
        then add_months(to_date('01-01-1900','MM-DD-YYYY'),(to_number(regexp_substr(DateStr,'[^-]+',1,3))-1900)*12+to_number(regexp_substr(DateStr,'[^-]+',1,1))-1)+to_number(regexp_substr(DateStr,'[^-]+',1,2))-1
        else null
      end
    else null
  end RealDateVal
from MyTable

此示例将日期格式设为&#34; MM-DD-YYYY&#34;,并假设&#34; MyTable&#34;得到日期字符串列&#34; DateStr&#34;。您可能需要根据需要进行相应调整。

总体方法是首先检查日期字符串的格式?? - ?? - ???? a&#34;?&#34;是一个数字,然后检查第一个?不超过12(本月)和第二?不大于31(日期)。如果全部通过,则使用&#34; add_months()&#34;来汇编日期类型的值。用于构建年份和月份,并使用&#34; +&#34;功能来建立日期。如果不满足任何这些条件,则返回null。

注1 :因为我们没有简单的方法来检查一年是否有2月29日而且我懒得检查一个月是否有第31个月,所以一天是无效的29日,30日或者31日,不会被有效性检查捕获,将被推到下个月。 (请参阅下面的示例。)并且查询永远不会返回错误。

注意事项2 :&#34;当......不为空时的情况......然后......结束&#34;是懒惰的,所以它不会评估&#34;然后......&#34;如果&#34;当......不为空时&#34;不满意。此功能是整体方法的基础。相反,函数nvl2()不是惰性的,不能代替使用。

实施例
&#39; 2015年6月15日&#39; - &GT;返回有效日期
&#39; 06-15-2015&#39; - &GT;返回null
&#39; 06/15 /到2015年&#39; - &GT;返回null
&#39; 15-06-2015&#39; - &GT;返回null
&#39; 2015年6月31日&#39; - &GT;返回有效日期为07-01-2015
&#39; 2015年2月30日&#39; - &GT;返回有效日期为03-02-2015

更进一步: 根据您想要走多远,您可以减轻&#34;注1和#34;通过将解析后的日期值转换回字符串并将其与原始日期字符串值进行比较。

答案 3 :(得分:0)

只需使用to_date函数检查日期是否有效。

BEGIN
  select TO_DATE(your_date,DateFormat) from dual;
EXCEPTION WHEN OTHERS THEN dbms_output.put_line('NOT A VALID DATE');
END;

答案 4 :(得分:0)

这种方法也是一个简单的select语句,不使用块,自定义函数或存储过程。

此示例假定日期格式为“MM-DD-YYYY”。它首先验证格式为“?? - ?? - ????”在哪里“?”是使用正则表达式的数字,然后验证月份(第一个“??”)不大于12,然后使用last_day()函数查找给定有效年/月的最后一天,以验证是否day part(第二个“??”)是该月的有效日期。当all都有效时,则使用to_date()函数进行解析,否则返回null。

var elements = document.querySelectorAll(".listentome");

for (var i = 0; i < elements.length; i++) {
  elements[i].addEventListener("mouseenter", function() {
    this.style.color = "red";
  });
}

答案 5 :(得分:0)

select lastlogin, IsDate(lastlogin,'MM/dd/yyyy  hh24:mi:ss') from users_table

呼叫:

[FunctionName("BlobTriggerCSharp")]        
public static void Run([BlobTrigger("demo/{name}")] string contents) 
{
   var person = JsonConvert.DeserializeObject<Person>(contents); 
}