查询以搜索在数据库中存储为字符串的日期

时间:2014-03-17 12:43:58

标签: sql sql-server date datetime

我有一个表格,我将活动完成日期存储为varchar。存储日期的格式为MM/DD/YYYY HH:MM:SS。 我有搜索窗口,其中有两个字段Completion date fromcompletion date to。此处选择的日期格式为MM/DD/YYYY

我如何编写一个查询,以便我能够从日期存储为varchar的表中获取两个给定日期之间的活动完成。这个表是很久以前创建的,没有考虑保存日期作为日期时间。

4 个答案:

答案 0 :(得分:3)

您可以使用SQL CONVERT将列更改为DATE格式,但这会导致性能问题。

SELECT *
    FROM MyTable
    WHERE CONVERT(DATETIME, MyDate) >= CONVERT(DATE, '01/01/2014')
        AND CONVERT(DATETIME, MyDate) <= CONVERT(DATE, '01/31/2014') 

CONVERT文档 - http://msdn.microsoft.com/en-us/library/ms187928.aspx

如果您无法更改数据的存储方式,那么为了获得更好的效果,您可以创建包含将VARCHAR转换为DATETIME的计算列的视图。之后可以在计算列上创建索引。 Index on Computed Column documentation

答案 1 :(得分:0)

您可以使用以下代码:

 select * from table_name
 where  CAST(col1 as date )  
between CAST(Completion date from as date ) 
        and CAST(Completion date to as date);

函数语法CAST:

CAST ( expression AS data_type )

答案 2 :(得分:0)

使用SUBSTRING函数以可比顺序获取日期部分(即yyyymmdd):

select *
from mytable 
where 
  CONCAT( SUBSTRING(thedate, 7, 4) , SUBSTRING(thedate, 4, 2) , SUBSTRING(thedate, 1, 2) )
between
  CONCAT( SUBSTRING(@FROMDATE, 7, 4) , SUBSTRING(@FROMDATE, 4, 2) , SUBSTRING(@FROMDATE, 1, 2) )
and
  CONCAT( SUBSTRING(@TODATE, 7, 4) , SUBSTRING(@TODATE, 4, 2) , SUBSTRING(@TODATE, 1, 2) )
;

答案 3 :(得分:0)

如果日期格式为{yyyy-MM-dd},则可以在下面使用,也可以根据格式调整charindex的索引值

SELECT * 
FROM table
WHERE 
    CHARINDEX('-', col_value, 0) = 5 
    AND CHARINDEX('-', col_value, 6) = 8
    AND LEN(col_value) = 10

上面的代码将查找第一个出现在位置5的字符'-',第二个出现在位置8的字符'-',而整个日期值的长度等于10个字符

这不是完整的证据,但会缩小搜索范围。如果要添加时间,则只需在适合格式的位置扩展条件即可,即{yyyy-MM-dd 00:00:00.000}

这是一种查询数据的安全方法,不会出现任何意外的“无效的转换无效”错误。