以字符串格式转换日期时间并将其传递给查询
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_ON
是 date
,这将有效 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);
我有一个查询,我正在以下面给定的格式传递值,它在 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_ON
是 date
,这将有效 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);