.Net DateTime.Now vs PostgreSQL时间戳比较

时间:2010-10-03 00:11:35

标签: c# postgresql mono

环境 Mono,PostgreSQL,.Net MVC,Windows

我试图展示将来发生的所有事件。

为了做到这一点,我使用以下SQL:

NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM dinners WHERE EventDate >= " + DateTime.Now, dinnerConn);

现在,如果我从数据库中比较DateTime.Now和我的EventDate时间戳,我会得到以下内容

(EventDate) 12/18/2010 7:00:00 PM - (DateTime.Now) 10/2/2010 7:59:48 PM

它们似乎很容易与我相提并论,但每当我运行此查询时,我都会得到以下结果:

ERROR: 42601: syntax error at or near "8"

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: Npgsql.NpgsqlException: ERROR: 42601: syntax error at or near "8"

Source Error: 


Line 106:           try
Line 107:           {
Line 108:               NpgsqlDataReader reader = command.ExecuteReader();
Line 109:               while (reader.Read()) 
Line 110:               {

Source File: c:\Documents and Settings\Andrew\My Documents\Visual Studio 2008\Projects\MvcApplication1\MvcApplication1\Models\DBConnect.cs    Line: 108 

现在,我知道该应用程序的工作方式不同,因为如果我要求它提取所有晚餐,或所有晚餐超过特定ID或特定晚餐,一切正常,它似乎只是试图将时间戳与DateTime进行比较。现在

我知道这很简单。我做错了什么?

3 个答案:

答案 0 :(得分:6)

此语法应解决您的问题:

NpgsqlCommand sql = db.CreateCommand();
sql.CommandType = CommandType.Text;
sql.CommandText = @"SELECT * FROM dinners WHERE EventDate >= @eventdate ;";
sql.Parameters.Add("eventdate", NpgsqlType.Date).Values = DateTime.Now;

您考虑更改查询(reference),以便两个时间戳几乎相同。

答案 1 :(得分:5)

您正在构建一个字符串命令,而不是确保DateTime序列化的格式是Postgres将正确解释的格式。

您可以使用适当的格式字符串调用DateTime.ToString()来使用一致的格式。为了更加安全,您可以在字符串中添加适当的SQL,以确保Postgres在读取命令时将其显式转换为日期,而不是依赖于隐式转换。

但是,Npgsql已经有代码来执行此操作,并且每次构建时都会对其进行NUnit测试。更好地依靠它:

NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM dinners WHERE EventDate >= :date", dinnerConn);
command.Parameters.Add(":date", DateTime.Now);

最后一种选择是不要从.NET传递DateTime,而是使用SELECT * FROM dinners WHERE EventDate >= now()。这样,当数据库认为是当前日期时,它将会过去。就连接的优化而言,有一些小的优点,但主要原因是为了保持多个调用者之间在同一数据库中的一致性。在一个“now”定义的地方(在这种情况下是数据库机器)可以防止不同机器的潜在问题略微不同步。

答案 2 :(得分:0)

现在不建议使用以前的Add()方法,请使用AddWithValue()

NpgsqlCommand command = new NpgsqlCommand("SELECT * FROM dinners WHERE EventDate >= :date", dinnerConn);
command.Parameters.AddWithValue(":date", new NpgsqlTypes.NpgsqlDate(DateTime.Now));