Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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
C# SQL To_日期表操作_C#_Sql_Oracle_Date - Fatal编程技术网

C# SQL To_日期表操作

C# SQL To_日期表操作,c#,sql,oracle,date,C#,Sql,Oracle,Date,基本上,我有以下查询,但无法提供正确的数据: SELECT a.* FROM ( SELECT a.*, rownum rnum FROM ( SELECT edate.expiration_date FROM ... ( SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') expiration_date FROM ... ) edate ) a WH

基本上,我有以下查询,但无法提供正确的数据:

SELECT a.* FROM 
  ( SELECT a.*, rownum rnum FROM ( 

     SELECT 

      edate.expiration_date

      FROM 
      ...

      ( SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') expiration_date 
       FROM  ... ) edate
  ) a WHERE rownum <= 20) 
 a WHERE rnum >= 1 AND 
 expiration_date < to_date('1/29/2010', 'MM/DD/YYYY HH24:MI:SS')
它不起作用的原因是,因为rownum/rnum评估与日期检查同时进行,所以它只获取日期在2010年1月29日之前的rownum,例如1、4、6、9,而不是日期小于2010年1月29日的前20个日期

所以基本上是这个地区

expiration_date < to_date('1/29/2010', 'MM/DD/YYYY HH24:MI:SS')

必须放在内部选择中,但每当我尝试这样做时,就会得到一个无效的月错误。如何将selects或子查询转换为to_日期以使其工作?

因此,撇开周围所有与分页相关的内容,您希望此查询:

SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') expiration_date 
  FROM ... 
 WHERE To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS')
       < to_date('1/29/2010', 'MM/DD/YYYY')

只运行它自己,它会失败吗?

所以,撇开它周围所有与分页相关的内容,您想要这个查询:

SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') expiration_date 
  FROM ... 
 WHERE To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS')
       < to_date('1/29/2010', 'MM/DD/YYYY')

仅仅运行它本身,它会失败吗?

在我看来,c.value包含的值可能不是日期。只是他们都不在前二十排。因此,当在外部查询中应用TO_日期时,查询成功,因为转换仅应用于前二十个值。但是,在内部查询中应用转换意味着尝试转换所有行,包括包含非日期值的行

这是使用将数据保存在通用字符串列中而不是使用相关数据类型的数据库设计的陷阱之一

怎么办?很明显,您可以更改数据模型,以便将日期保存在使用日期数据类型定义的列中,但我怀疑这可能比您所期望的要多。另一种选择是使用这样的混乱局面

create or replace function is_a_date 
    (p_str in varchar2
     , p_mask in varchar2 := 'MM/DD/YYYY HH24:MI:SS')
    return date
is
    return_value date;
begin
    begin
        return_value := to_date(p_str, p_mask);
    exception
        when others then
            return_value := null;
    end;
    return return_value;
end;
/
这将获取一个字符串,并尝试使用格式掩码将其转换为日期。如果是适当格式的日期,则返回日期,否则返回空值:

SQL> select is_a_date('01/01/2000 23:56:07') from dual
  2  /

IS_A_DATE
---------
01-JAN-00

SQL> select is_a_date('APC is not a date') from dual
  2  /

IS_A_DATE
---------


SQL>

在我看来,c.value包含的值可能不是日期。只是他们都不在前二十排。因此,当在外部查询中应用TO_日期时,查询成功,因为转换仅应用于前二十个值。但是,在内部查询中应用转换意味着尝试转换所有行,包括包含非日期值的行

这是使用将数据保存在通用字符串列中而不是使用相关数据类型的数据库设计的陷阱之一

怎么办?很明显,您可以更改数据模型,以便将日期保存在使用日期数据类型定义的列中,但我怀疑这可能比您所期望的要多。另一种选择是使用这样的混乱局面

create or replace function is_a_date 
    (p_str in varchar2
     , p_mask in varchar2 := 'MM/DD/YYYY HH24:MI:SS')
    return date
is
    return_value date;
begin
    begin
        return_value := to_date(p_str, p_mask);
    exception
        when others then
            return_value := null;
    end;
    return return_value;
end;
/
这将获取一个字符串,并尝试使用格式掩码将其转换为日期。如果是适当格式的日期,则返回日期,否则返回空值:

SQL> select is_a_date('01/01/2000 23:56:07') from dual
  2  /

IS_A_DATE
---------
01-JAN-00

SQL> select is_a_date('APC is not a date') from dual
  2  /

IS_A_DATE
---------


SQL>

我真的建议您修复数据模型并将日期值存储在单独的列中。 如果做不到这一点,您可以尝试添加

where ltrim(substr(c.value,1,3),'0 ') in ('1/','2/',...'12/')
如果传入值为1/31/2010,而不是1/31/2010或1/31/2010,则需要相应地更改过滤器。看看正则表达式匹配


但是,除非您修复该模型,否则您将在这方面浪费大量时间

我真的建议您修复数据模型并将日期值存储在单独的列中。 如果做不到这一点,您可以尝试添加

where ltrim(substr(c.value,1,3),'0 ') in ('1/','2/',...'12/')
如果传入值为1/31/2010,而不是1/31/2010或1/31/2010,则需要相应地更改过滤器。看看正则表达式匹配


但是,除非你修正了这个模型,否则你将在这个问题上浪费更多的时间。根据你问题中的信息、前三个答案和随后的评论,这实际上听起来似乎与前20个值无关,这是一种误导。这听起来可能与最内部的select中隐藏的逻辑有关。我相信其中的某些内容正在从表C中删除记录,因此C.上的TO_DATE值不会出现在无效日期的字段中,但当您添加TO_DATE C.值“MM/DD/YYYY HH24:MI:SS”时,“MM/DD/YYYY”到最内部的SQL,它发生在表C中的所有字段上。您应该能够通过简单地切换外部和第一个嵌入的WHERE子句来避免这种情况

SELECT a.* FROM 
  ( SELECT a.*, rownum rnum FROM 

      ( SELECT 

               edate.expiration_date

        FROM 
        ...

          ( SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') expiration_date 
            FROM  ... ) edate
      ) a 
    WHERE expiration_date < to_date('1/29/2010', 'MM/DD/YYYY HH24:MI:SS')
  )  a 
WHERE rnum >= 1 AND 
      rownum <= 20
如果由于无法更改的其他逻辑而无法执行此操作,则应能够在最内部的a中添加WHERE子句,以表示到期日<至日期'1/29/2010','MM/DD/YYYY'


一、 就个人而言,如果数据无效,您会尝试修复数据,这样您或其他人以后就不会再遇到此问题,但您也可以在将来访问此字段时使用APC的功能。

根据您问题中的信息、前三个答案和后续评论,实际上,这听起来好像与前20个值无关,这是在转移注意力。这听起来可能与最内部的select中隐藏的逻辑有关。我相信里面有雷莫 从表C中删除记录,以便在无效日期的字段中不会出现“C上的截止日期”值,而是在添加“截止日期”值“MM/DD/YYYY HH24:MI:SS”时,“MM/DD/YYYY”到最内部的SQL,它发生在表C中的所有字段上。您应该能够通过简单地切换外部和第一个嵌入的WHERE子句来避免这种情况

SELECT a.* FROM 
  ( SELECT a.*, rownum rnum FROM 

      ( SELECT 

               edate.expiration_date

        FROM 
        ...

          ( SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') expiration_date 
            FROM  ... ) edate
      ) a 
    WHERE expiration_date < to_date('1/29/2010', 'MM/DD/YYYY HH24:MI:SS')
  )  a 
WHERE rnum >= 1 AND 
      rownum <= 20
如果由于无法更改的其他逻辑而无法执行此操作,则应能够在最内部的a中添加WHERE子句,以表示到期日<至日期'1/29/2010','MM/DD/YYYY'


一、 就个人而言,如果数据无效,你会尝试修复数据,这样你或其他人以后就不会再遇到这种情况,但你也可以在将来访问此字段时使用APC的函数。

我有以下查询,但没有给出正确的数据,这是一个有趣的查询定义,可以工作;您的所有数据值是否都是有效日期?我有下面的查询,但没有给出正确的数据,这是一个有趣的查询定义;您的所有数据值是否都在有效日期?可能某些c.value包含错误数据,例如“99/01/2010”?为什么这个日期被保存在VARCHAR2中?也许某些c.value保存了错误的数据,例如“99/01/2010”?为什么这次约会要在瓦查尔举行?这似乎是有道理的。我能不能不在语句中使用NVL包装?反驳c.value包含非日期值的假设的一件事是,查询N个行,其中N>20行有效。唯一的问题是我无法成功地限制这些查询,因此前二十行最终变成像第1、4、6、9、18行一样。@Rio-那么在c.value中有哪些数据?实际上,您可以查询该表,这样您就不必假设了。c.value中的所有数据都是格式为MM/DD/YY 00:00:00的varchar。这些值上的截止日期将返回一个正确的、充满数据的列,因此c.values上的截止日期是有效的。这似乎是合理的。我能不能不在语句中使用NVL包装?反驳c.value包含非日期值的假设的一件事是,查询N个行,其中N>20行有效。唯一的问题是我无法成功地限制这些查询,因此前二十行最终变成像第1、4、6、9、18行一样。@Rio-那么在c.value中有哪些数据?实际上,您可以查询该表,这样您就不必假设了。c.value中的所有数据都是格式为MM/DD/YY 00:00:00的varchar。这些上的“截止日期”将返回一个正确的列,其中包含完整的数据,因此c.values上的“截止日期”有效。谢谢。这似乎很有帮助,我会试一试。在运行它或发现任何不良数据方面有什么运气吗?谢谢。这似乎很有帮助,我会试一试。在运行它或发现任何不良数据方面运气好吗?