为什么我的SQL查询在转换后比较日期时选择所有行?

时间:2012-09-26 21:34:48

标签: c# sql webmatrix

我正在使用WebMatrix和SQL Server Compact,只是有一个简单的问题。我有一行代码:

if(cndDateLastModified=="gteq"){stringCompiler+="'CAST(DateLastModified AS datetime)' >= 'CAST(" + DateLastModified + " AS datetime)' ";}////

通过在屏幕上绘制输出,查询具体如下:

SELECT * FROM POITable WHERE 'CAST(DateLastModified AS datetime)' >= 'CAST(09/25/2012 AS datetime)'

由于某种原因,它返回指定日期之前,之后和之后的所有行。 在查询时我仍然有点绿,但是对于所有研究过的帐户,这应该有用。显然它正在做一些我不太喜欢的事情,考虑到这一点是可以理解的。

关于如何让我按照我想要的方式工作的任何想法?它还在尝试比较字符串或其他格式吗?

注意:对于两次转换,我都尝试使用CONVERT(datetime,DateLastModified)和CONVERT(datetime,DateLastModified,1)。

另一个注意事项:它作为字符串存储在数据库中。

另一个注意事项:如果我切换条件(从> =到< =)它会反过来并且不会返回任何行,我会考虑第一个意外的结果集,但仍然不知道为什么

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

因为您使用单引号比较两个字符串。 'CAST(....)'与'CAST(...)'。你也可以写WHERE'Ginger'> ='Fred'你会得到相同的结果。 :d

您应该需要的是: FROM POITable WHERE CAST(DateLastModified AS datetime)> = CAST('09 / 25 / 2012'AS datetime)

在文字日期周围使用单引号。 '09 / 25 / 2012'

但是,如果您使用的是SQL Server,则可以使用WHERE CAST(DateLastModified AS datetime)> ='2012-09-25'

此外,如果表的DateLastModified列已经是日期时间,请删除强制转换。 Cast用于将字符串转换为数据类型。我的预感就是你需要的是:

WHERE DateLastModified >= '2012-09-25' /* ISO date strings are understood and accepted by SQL Server. */
or
WHERE DateLastModified >= GETDATE() /*Everything in the future, time inclusive.*/
or
WHERE DateLastModified >= DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) /* Everything starting today. */

答案 1 :(得分:1)

应该是这样的

stringCompiler+="CAST(DateLastModified AS datetime) >= CAST('" + DateLastModified + "' AS datetime) "

请注意单引号的位置已更改

那会给你

CAST(DateLastModified AS datetime) >= CAST('09/25/2012' AS datetime)