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

时间:2015-05-13 18:03:53

标签: sql-server date coldfusion

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

2 个答案:

答案 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将确保最一致的结果。