1

我正在使用带有 SQL Server Compact 的 WebMatrix,并且有一个简单的问题。我有一行代码:

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) 进行这两种转换。

另一个注意事项:它以字符串的形式存储在数据库中。

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

有任何想法吗?

4

2 回答 2

3

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

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

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

但是,如果您使用的是 SQL 服务器,则可以只使用 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. */
于 2012-09-26T21:45:54.200 回答
1

应该是这样的

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

注意单引号的位置发生了变化

那给你

CAST(DateLastModified AS datetime) >= CAST('09/25/2012' AS datetime) 
于 2012-09-26T21:47:05.240 回答