如何在 postgresSQL 的 dapper 参数中传递日期时间格式?

ank*_*kur 2 c# postgresql dapper

对于 PostgreSQL 中的表的查询,我能够正确获取数据。

var query = "Select Id,name from employee
where
joiningTime BETWEEN '{startDateTime:yyyy-MM-dd HH:mm:ss}' AND '{endDateTime:yyyy-MM-dd HH:mm:ss}'"
Run Code Online (Sandbox Code Playgroud)

数据返回正确,但由于这种方法容易发生 SQL 注入,我想将其更改为参数化方式

var query = "Select Id,name from employee
    where
    joiningTime BETWEEN '@startDateTime' AND '@endDateTime'"


var result = dbConnection.Query<Result>(query, new {startDateTime, endDateTime }); 
Run Code Online (Sandbox Code Playgroud)

怎么还能带参数传递格式呢?

Cai*_*ard 5

DateTimes 没有格式,它们就像数字(例如,1000 可以格式化为 1000.0 或 1x10^3 等,但它仍然只是一千)。

您只需编写如下查询:

SELECT * FROM t WHERE dateCol BETWEEN @fromDate AND @toDate
Run Code Online (Sandbox Code Playgroud)

注意:您不要放置'参数名称!

在简洁的调用中,您输入日期时间类型的参数:

DateTime x = DateTime.Now.AddDays(-1);
DateTime y = DateTime.Now;
dbConnection.Query<Result>(query, new { fromDate = x, toDate = y});
Run Code Online (Sandbox Code Playgroud)

如果在数据库中,您已将日期时间列设置为 varchar 并用字符串填充它们,这是您应该修复的第一件事(使它们成为正确的日期类型)。

但即使你这样做了,建议也不会改变:

DateTime x = DateTime.Now.AddDays(-1);
DateTime y = DateTime.Now;
dbConnection.Query<Result>(
  "SELECT * FROM t WHERE dateCol BETWEEN @fromDate AND @toDate", 
  new { 
      fromDate = x.ToString("yyyy-MM-dd HH:mm:ss"), 
      toDate = y.ToString("yyyy-MM-dd HH:mm:ss")
  }
);
Run Code Online (Sandbox Code Playgroud)

您仍在将参数写入 SQL,现在将格式化字符串放入参数值中以匹配数据库表中的格式化字符串。如果您的表包含 DATE/TIME/TIMESTAMP 类型列,请不要这样做 - 这只适用于您已经安排了将日期存储为字符串的可疑(愚蠢)_情况并且不愿意更改它的情况(您应该)