我正在将 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) 进行两次转换。
另注:它以字符串的形式存储在数据库中。
另一个注意事项:如果我切换条件(从 >= 到 <=),它会执行相反的操作并且不返回任何行,考虑到第一个意外的结果集,我会有点期待,但仍然不知道为什么。
有什么想法吗?
最佳答案
因为单引号是在比较两个字符串。 “CAST(....)”与“CAST(...)”。你也可以写 WHERE 'Ginger' >= 'Fred' 你会得到相同的结果。 :D
你应该需要的是: FROM POITable WHERE CAST(DateLastModified AS datetime) >= CAST('09/25/2012' AS datetime)
在文字日期周围使用单引号。 '2012 年 9 月 25 日'
但是,如果您使用的是 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. */
关于c# - 为什么我的 SQL 查询在转换后比较日期时选择所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12610801/