【问题标题】:Date Picker format vs Database timestamp日期选择器格式与数据库时间戳
【发布时间】:2015-05-13 18:03:52
【问题描述】:

如果两个日期的格式不同,是否可以比较它们?一个日期来自 ColdFusion UI 输入,格式如下:

mm/dd/yyyy 

我的 MSSQL 数据库中的时间戳采用以下格式:

yyyy/mm/dd

背景:我需要编写一个查询来比较日期并在用户选择日期之后返回带有时间戳的行。我需要重新格式化任一日期吗?

示例:

<cfset start_date = 'form.sDate'>

<cfquery name="sortDate" datasource="RC">
SELECT *
FROM my_db_table
WHERE Submission_Date > #start_date#
</cfquery>

【问题讨论】:

  • 你试过了吗?我猜 SQL Server 会为您进行转换,但您需要用引号将您的日期括起来,例如 '#start_date#'
  • 我确实尝试过不带引号,但它仍然返回了所有内容。我会用引号试一试,看看我得到了什么。感谢您的反馈。 +1
  • 您可以使用 DateTimeFormat(todayDateTime,"yyyy/mm/dd") 将日期从 CF 转换为 yyyy/mm/dd,然后使用 wikidocs.adobe.com/wiki/display/coldfusionen/DateDiff
  • 感谢 Miguel,单引号使其无法正常工作。如果你想把它放在一个答案中,我会接受它。
  • @Leigh - 像往常一样很重要。谢谢。

标签: sql-server date coldfusion


【解决方案1】:

首先,当动态包含内容时,始终在查询中使用 cfqueryparam。其次,您应该能够“按原样”使用 start_date 将日期与数据库中的日期进行比较

所以,类似:

<cfquery name="sortDate" datasource="RC">
    SELECT *
    FROM my_db_table
    WHERE Submission_Date > <cfqueryparam value="#start_date#" cfsqltype="cf_sql_date">
</cfquery>

最后,您可以随时在 MSSQL Management Studio 中测试原始 sql 以测试日期比较。

【讨论】:

  • 感谢您的信息。我将确保在所有查询上使用 cfqueryparam
【解决方案2】:

(对于 cmets 来说太长了...)

这里有一些细微的区别,理解这一点很重要。

您正在使用一个 string 和一个日期对象,而不是两个日期。此外,SQL Server 实际上并不以yyyy/mm/dd 格式存储日期。日期在内部存储为大数字。由于这些对于人类来说很难处理,因此无论您使用什么 IDE 都会以更人性化的方式显示它们,例如 yyyy/mm/dd 格式。但同样,这并不意味着数据库实际上将它们存储为字符串。

由于日期选择器值是一个字符串,你应该validate it first, then convert the string into a date object。比较苹果和橙子(即日期和字符串)是常见的问题。这几乎总是日期查询出错的地方。这就是为什么将字符串转换为日期对象很重要的原因。它确保数据库比较相同的事物,即两个日期,并且结果将始终如您所愿。

最后,使用 cfqueryparam 将值正确传递到您的数据库。请务必使用与 db 列对应的 cfsqltype:cf_sql_date (date only) or cf_sql_timestamp (date and time)

从技术上讲,如果字符串总是采用mm/dd/yyyy 格式,您可以“按原样”传递字符串,CF 会自动为您转换。但是,相信输入始终是正确的格式并不是一个好主意。验证输入并使用 cfqueryparam 将确保获得最一致的结果。

【讨论】:

  • 这是很好的信息。感谢分享这非常有帮助。 +1
猜你喜欢
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多