我有一个查询,我正在以下面给定的格式传递值,它在oracle pl/sql 中工作
Select ASE_ID
from ASE_DTLS a
where TO_CHAR(CRT_ON,'YYYY-MM-DD')
between '2020-09-01' and '2020-09-23'
上面的查询给出了输出。但当我试图以下面给定的格式通过c#query传递它时,它不会返回值。
Select ASE_ID
from ASE_DTLS a
where TO_CHAR(CRT_ON,'YYYY-MM-DD')
between :CRT_ON and :CRT_ON";
正在从'01-09-2020 00:00:00'&'中的fieldval[0]中的post方法接收值23-09-2020 00:00:00'格式。
command.Parameters.Add(":CRT_ON", fieldval[0].From.ToString("yyyy-MM-dd"));
command.Parameters.Add(":CRT_ON", fieldval[0].To.ToString("yyyy-MM-dd"));
在通过ExecuteReader读取时获得0条记录。发件人&To如c#中所定义
public DateTime From { get; set; }
public DateTime To { get; set; }
oracle中的CRT_ ON作为日期。
.NET和Oracle中的日期都没有格式,它们是二进制值。查询应该使用与日期相关类型的参数,而不是将日期转换为字符串,只是将它们转换回日期。
代码还有其他问题——同一个参数被添加了两次,但值不同。查询本身使用BETWEEN
子句中的单个参数,有效地将其转换为相等性检查。
查询应该是:
Select ASE_ID
from ASE_DTLS a
where CRT_ON between :CRT_FROM and :CRT_TO
参数的类型应为DateTime
:
var fld=fieldval[0];
command.Parameters.Add(":CRT_FROM", OracleDbType.Date).Value = fld.From.Date;
command.Parameters.Add(":CRT_TO", OracleDbType.Date).Value = fld.To.Date;
DateTime.Date只返回DateTime值的日期部分。
如果CRT_ON
是date
,这将按原样工作。如果是timestamp
,则查询在00:00时只返回最多为:CRT_TO
的行。要返回当天的日期,查询必须更改为
Select ASE_ID
from ASE_DTLS a
where CRT_ON >= :CRT_FROM and CRT_ON < :CRT_TO
:CRT_TO
应增加一天:
var toParam=command.Parameters.Add(":CRT_TO", SqlDbType.DateTime);
toParam.Value = fld.To.Date.AddDays(1);
您应该使用日期作为date
。不要将其转换为char
。
Select ASE_ID from ASE_DTLS a where trunc(CRT_ON) between to_date('2020-09-01','YYYY-MM-DD') and to_date('2020-09-23','YYYY-MM-DD')