【问题标题】:How do I convert an SQL date result to British format (dd/mm/yyyy)如何将 SQL 日期结果转换为英式格式 (dd/mm/yyyy)
【发布时间】:2011-09-28 15:22:26
【问题描述】:

我在 ASP/C# 中设计了一个基本搜索,用于搜索数据库中的记录,并为用户提供了可用于搜索的以下字段:word/phrase、dateFrom、dateTill。因此分别输入“Hello, World!”, 05/25/2009, 06/25/2009 将搜索到内容为“Hello, World!”的数据库记录。这是在给定日期之间创建的。很简单的东西。

用户在字段中输入的文本直接注入如下 SQL 语句:

SELECT r.idRecord, r.recordText
FROM record r
WHERE LOWER(CAST(r.recordText AS VARCHAR)) LIKE LOWER('%" + word/phrase + "%')
  AND r.creationDate BETWEEN '" + dateFrom + "' AND '" + dateTill + "'"

所以仍然非常简单,当用户以美国格式输入日期时,它就像一个魅力,mm/dd/yyyy。但是,当输入英国格式的日期(例如 25/05/2009)时,它会失败。终于……

SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS [DD/MM/YYYY]

...不是特别有用,因为我不想选择日期,可以在 WHERE 子句中使用类似的语句吗?

感谢您的帮助。

【问题讨论】:

  • 附带说明:您应使用参数化 SQL。永远不要使用字符串连接来创建 SQL 语句。

标签: c# asp.net sql date


【解决方案1】:

Heinzi 的评论根本不是旁注:您绝对应该在这里使用参数化 SQL。那样:

  • 您无需担心日期/时间字段的格式设置,因为您没有向数据库提供格式化版本
  • 您无需担心文本字段的 SQL 注入
  • 您将代码 (SQL) 与数据(日期、单词等)清晰地分开

您根本不应该在 SQL 中包含动态值 - 始终使用参数。示例见the documentation for SqlCommand.Parameters

【讨论】:

  • 感谢您提供此信息。我是新手,基本上是在使现有系统更适合用户的需求。我看到到处都在使用动态值,所以我认为这是一种很好的做法。我会改进我的技术。
  • @bobble14988:那么请将您的发现传递给其他开发人员 - 代码目前基本上对 SQL 注入攻击开放,听起来。给他们看bobby-tables.com
【解决方案2】:

使用DateTime.ParseExact method 将用户输入的值解析为DateTime 数据类型。此方法允许您指定日期时间的格式,因此您可以使用dd/MM/yyyyMM/dd/yyyy,具体取决于您的用户偏好。然后将 DateTime 值作为参数传递给您的 SQL 语句。

这是一篇解释性的博文

  • 如何使用参数化SQL语句和
  • 为什么 SQL-by-string-concatenation 是邪恶的:

Coding Horror: Give me parameterized SQL, or give me death

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多