我有一个实体的两个表 - 比如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'是以毫秒为单位转换的日期。
请建议。
答案 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()
希望这有帮助