两个日期的比较

时间:2014-05-11 16:09:29

标签: asp.net sql-server-2008

我想比较一个当前日期和其他存储在数据库中的两个不同日期。

当前日期

DateTime CurrentDate = DateTime.Now;
String Date = CurrentDate.ToString("dd/MM/yyyy");

查询

String query_str = "SELECT * FROM [" + TAdvert_table + "] WHERE ([Country]='China' AND [Viewed] IS NULL) AND ([DateStart]="+Date+")";

例外:

{"Operand type clash: date is incompatible with int"}

表定义

Id          int Checked
Title           varchar(50) Checked
Description varchar(MAX)    Checked
ImageLocation   varchar(50) Checked
Country         varchar(50) Checked
City            varchar(50) Checked
NrInQueue   varchar(50) Checked
DateStart   date            Checked
DateEnd         date            Checked
NoOfClicks  int         Checked
Paid            varchar(50) Checked
Viewed          varchar(5)  Checked

2 个答案:

答案 0 :(得分:3)

问题:

执行以下源代码后:

DateTime CurrentDate = DateTime.Now;
String Date = CurrentDate.ToString("dd/MM/yyyy");
String query_str = "SELECT * FROM [" + TAdvert_table + "] WHERE ([Country]='China' AND [Viewed] IS NULL) AND ([DateStart]="+Date+")";

query变量可能包含此T-SQL查询:

SELECT * FROM YourTable WHERE ([Country]='China' AND [Viewed] IS NULL) AND ([DateStart]=11/05/2014)

以下表达式:11/05/2014被视为数学表达式,并被评估为0。在SQL Server Management Studio中尝试:

SELECT 11/05/2014 -- > 0

此表达式11/05/2014的结果也是INT(不是DECIMAL / NUMERIC / FLOAT / REAL)。

尝试:

SELECT SQL_VARIANT_PROPERTY(11/05/2014, 'BaseType') -- > INT

这就是此谓词([DateStart]=11/05/2014)生成错误Operand type clash: date is incompatible with int的原因。另外,你可以尝试:

SELECT CASE WHEN CONVERT(DATE, GETDATE()) = 11/05/2014 THEN 1 ELSE 0 END

会产生相同的错误。

<强>解决方案:

1)您可以使用单引号(... '"+Date+"'):

String query_str = "SELECT * FROM [" + TAdvert_table + "] WHERE ([Country]='China' AND [Viewed] IS NULL) AND ([DateStart]='"+Date+"')";

因此,生成的查询可以是:SELECT ... ([DateStart]='11/05/2014')。这可以或不,具体取决于当前的DATEFORMAT setting

注意:我不会使用此解决方案。

2)为避免不同DATEFORMAT设置导致的问题,您可以使用以下ISO 8601格式YYYY-MM-DD

String Date = CurrentDate.ToString("yyyy-MM-dd");
String query_str = "SELECT ... AND ([DateStart]='"+Date+"')";

注意:我不会使用此解决方案。

3)更好的方法是使用参数化查询:

SqlCommand command = new SqlCommand("SELECT ... WHERE ([Country]='China' AND [Viewed] IS NULL) AND ([DateStart]=@pDateStart)", connection);
command.Parameters.Add("@pDateStart", SqlDbType.Date);
command.Parameters["@pDateStart"].Value = CurrentDate;

注意:通过连接字符串(例如:表名)can be dangerous生成SQL查询。

答案 1 :(得分:0)

将查询结尾更改为

"([DateStart]='"+Date+"')"