EDIT..sorry列是字符串db是mysql我相信.
我正在尝试进行查询,但不知道如何编写它,目前我有
adoquery1.SQL.Add('SELECT * FROM workorder WHERE siteid=''p203'' AND worktype = ''CM'' AND reportdate > '''+edit1.text+'''') ;
Run Code Online (Sandbox Code Playgroud)
它使用日期分级器获取数据,然后使用edit1.text中的日期获取数据,我如何才能说出获取相同的数据但是在两个日期之间使用reportdate?
例
siteid = p203 AND
worktype = CM AND
reportdate between edit1.text and edit2.text
Run Code Online (Sandbox Code Playgroud)
许多数据库都有BETWEEN运算符,否则您可以随时使用(reportdate >= :date1 and reportdate <= :date2).
SELECT * FROM workorder
WHERE siteid = :siteId AND worktype = :workType
AND reportdate between :date1 and :date2
Run Code Online (Sandbox Code Playgroud)
要么,
SELECT * FROM workorder
WHERE siteid = :siteId AND worktype = :workType
AND (reportdate >= :date1 and reportdate <= :date2)
Run Code Online (Sandbox Code Playgroud)
第二种形式可以让您更好地控制是使用闭合开放(包括在开始时)还是封闭(包括在两端)边界.
理想情况下,您可以使用绑定参数 - 对语句中的每个参数使用:name占位符,并为它们绑定值.(我们使用其他语言?).
除了通过引用防止SQL注入攻击和错误之外,使用DATE或TIMESTAMP数据类型也可以更可靠.应正确解析日期并在应用程序层将字符串转换为此类,而不是将其存储为数据库中的字符串.
adoquery1.SQL.Add('SELECT * FROM workorder');
adoquery1.SQL.Add('WHERE siteid=:SiteId AND');
adoquery1.SQL.Add('worktype = :WorkType AND');
adoquery1.SQL.Add('reportdate between :StartDate and :EndDate ');
adoquery1.Parameters[0].Value := 'p203';
adoquery1.Parameters[1].Value := 'CN';
adoquery1.Parameters[2].Value := Edit1.Text;
adoquery1.Parameters[3].Value := Edit2.Text;
Run Code Online (Sandbox Code Playgroud)
这段代码片段的重点在于使用参数解决问题同样容易"内联"你的Sql.
主要的好处是你的数据会被自动消毒,有两种效果 - i)你可以防止Sql注入攻击; ii)你不必对数据进行预处理 - 例如,如果Surname是"O'Flannagan",则将其作为内联传递值需要预处理功能,例如RemoveApostrophes().
Oracle等服务器还有一个额外的好处 - Oracle优化器将缓存查询计划.如果它遇到相同的Sql,它将使用缓存的计划,因此表现更好.它可以将参数标识为"相同",但如果每次提供不同的Sql则不能.(我不能特别评论其他RDBMS,但如果同样适用我也不会感到惊讶.)
在我看来,这种方法至少与另一种方法一样可读.
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |