以字符串格式转换日期时间并将其传递给查询

convert datetime in string format and pass it to query

我有一个查询,我正在以下面给定的格式传递值,它在 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# 查询传递它时,它没有返回值。

Select ASE_ID  
from ASE_DTLS a 
where TO_CHAR(CRT_ON,'YYYY-MM-DD') 
    between :CRT_ON and :CRT_ON";

从 fieldval[0] 中的 post 方法接收值,格式为“01-09-2020 00:00:00”和“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 条记录。 从 & 到在 c#

中定义
 public DateTime From { get; set; }
 public DateTime To { get; set; }

和 CRT_ON 在 oracle 中作为日期。

您应该使用日期 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')

.NET 和 Oracle 中的日期都没有格式,它们是二进制值。查询应该使用 date-related 类型的参数,而不是将日期转换为字符串,只是将它们转换回日期。

该代码还有其他问题 - 相同的参数被添加了两次,但值不同。查询本身在 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 returns 只是 DateTime 值的日期部分。

如果 CRT_ONdate,这将有效 as-is。如果它是 timestamp,则查询将 return 行最多只到 00:00 处的 :CRT_TO。到那天的 return 个日期,查询将不得不更改为

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);