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



如果以不同的方式格式化两个日期,是否可以比较两个日期?一个日期来自以下格式的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>

首先,在您的查询中始终在您的查询中使用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管理工作室中测试RAW SQL来测试日期比较。

(过长的评论...)

这里有一些微妙的区别,重要的是要理解。

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

由于datePicker值为a string ,您应该先验证它,然后将字符串转换为日期对象。比较苹果和橙子(即日期和字符串)是常见的。那几乎总是日期查询出现问题的地方。这就是为什么将字符串转换为日期对象很重要的原因。它确保数据库比较了两个日期,并且结果将永远是您期望的。

最后,使用cfqueryparam正确地将值传递给数据库。请确保使用与DB列相对应的CFSQLTYPE:CF_SQL_DATE(仅日期)或CF_SQL_TIMESTAMP(日期和时间)。

从技术上讲,如果字符串是始终mm/dd/yyyy格式中,则可以按照"原样"传递",并且CF将自动为您转换它。但是,信任输入始终以正确的格式是一个好主意。验证输入和使用CFQUERPARAM将确保最一致的结果。

最新更新