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

标签 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) 进行两次转换。

另注:它以字符串的形式存储在数据库中。

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

有什么想法吗?

最佳答案

因为单引号是在比较两个字符串。 “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/

相关文章:

c# - 如何访问匿名类型?

javascript - 使用 Razor/C# 循环遍历 HTML 表以获取每个 <tr> 中的数据

webmatrix - 使用 razor 进行内联编码是 webmatrix 的唯一选择吗?

c# - 添加 toastr javascript asp.net webform

c# - 文件路径中的空格问题 - C# 中的命令行执行

sql - 使用 SQL 变量与子查询的优缺点是什么?

java - 获取 SQL 查询响应中每个重复记录的计数

mysql - 表示数据库中的下拉列表值

c# - 创建没有引用的对象

c# - 获取登录用户的 AppData\Local 文件夹