我有一个表格,我将活动完成日期存储为varchar
。存储日期的格式为MM/DD/YYYY HH:MM:SS
。
我有搜索窗口,其中有两个字段Completion date from
和completion date to
。此处选择的日期格式为MM/DD/YYYY
。
我如何编写一个查询,以便我能够从日期存储为varchar的表中获取两个给定日期之间的活动完成。这个表是很久以前创建的,没有考虑保存日期作为日期时间。
答案 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}
这是一种查询数据的安全方法,不会出现任何意外的“无效的转换无效”错误。