如果以不同方式格式化两个日期,是否可以比较它们?一个日期来自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>
答案 0 :(得分:5)
首先,在动态包含内容时始终在查询中使用cfqueryparam 。其次,你应该可以使用start_date&#34;原样&#34;将日期与数据库中的日期进行比较
所以,比如:
<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以测试日期比较。
答案 1 :(得分:5)
(评论太长了......)
这里有一些细微的区别,重要的是要理解。
您正在使用字符串和日期对象,而不是两个日期。此外,SQL Server实际上并不以yyyy/mm/dd
格式存储日期。日期在内部存储为大数字。由于人类难以处理这些内容,因此无论您使用哪种IDE,都会以更加人性化的方式显示它们,例如yyyy/mm/dd
格式。但同样,这并不意味着数据库实际上将它们存储为字符串。
由于datepicker值是字符串,因此您应该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将确保最一致的结果。