日期选择器格式与数据库时间戳

Date Picker format vs Database timestamp

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

mm/dd/yyyy 

我的 MSSQL 数据库中的时间戳格式如下:

yyyy/mm/dd

背景:我需要编写一个查询,将日期和 returns 行与用户选择日期之后的时间戳进行比较。我需要重新格式化任一日期吗?

示例:

<cfset start_date = 'form.sDate'>

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

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

所以,类似于:

<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 以测试日期比较。

(评论太长了...)

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

您正在处理一个 字符串 和一个日期对象,而不是两个日期。此外,SQL 服务器实际上并不以 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 格式,您可以传入字符串 "as is",CF 会自动为您转换它。然而,相信输入的格式总是正确的并不是一个好主意。验证输入并使用 cfqueryparam 将确保最一致的结果。