允许搜索存储为字符串的无效日期 - 是否推荐

时间:2011-11-18 12:14:52

标签: sql-server

我有一个实体的两个表 - 比如Valid_Doc和Invalid_Doc。如果文档有效,则所有数据都保存在Valid_Doc表中。如果文档的任何属性无效,它将保存在Invalid_Doc中.Due_Date是两个表的列的开头。在Invalid_Doc中,我们将无效日期保存为字符串

假设用户是否通过具有以下日期的搜索屏幕搜索文档

Due_Date - 之后 - 07/07/11 , 我们应该显示两个表中的所有文档。由于Invalid_Doc表中的Due_Date是字符串,我们无法将输入的搜索日期与 Invalid_Doc 表中数据库中可用的日期进行比较。

有人可以指导我是否使用DATEDIFF - 即需要首先将DB中的字符串日期转换为日期(毫秒),然后与输入的数据进行比较。这样,有可能是不可预知的结果。因此,我们是否允许用户通过日期或非日期搜索无效文档。

Select * FROM   invalid_doc iil WITH (nolock) WHERE
CAST(Datediff(s, '19700101 05:00:00:000', iil.due_date) AS NUMERIC) * 
   1000 
   BETWEEN '1120501800000' AND '1120501800000'

其中'1120501800000'和'1120501800000'是以毫秒为单位转换的日期。

请建议。

2 个答案:

答案 0 :(得分:4)

我会使用regex(例如Q20011231Q)将数据库中的日期转换为统一的字符串格式,并在搜索之前将查询转换为相同的格式。 通过这种方式,您可以控制数据并轻松进行比较

答案 1 :(得分:0)

我继续回答:) 由于我不知道您的语言,因此您处理xml数据我强烈建议您在插入数据库时​​验证日期。 无法在数据时间字段中输入无效数据值。

如果您有类似11/24/2011的数据并插入它,则日期时间值始终会添加时间本身。 然后你有例如。 11/24/20011 17:29:00 000作为值存储。

如果您插入的日期少于可能崩溃的日期,或者该值可以转换为有效日期,则缺少的部分将被“当前日期信息”替换。

所以实际上你必须验证你的字符串,转换它。像这样:

-- @datestring <= somehow your string from xml
SET arithabort arith_overflow OFF
SET @date = CAST(@datestring AS DATETIME)
IF @date is NULL SET @date = GETDATE()
SET arithabort arith_overflow ON

关闭溢出错误模式,尝试转换并在失败时设置默认值。

或者在MS SQL中

   IF ( ISDATE(@date_string) = 0 ) SET @date = GETDATE()

希望这有帮助