在SQL查询中拆分字符串

时间:2010-01-21 11:01:07

标签: sql intersystems-cache

我在2009-11-25, 12:42AM IST格式的字符串中将名为“postdate”的字段中的值设置为名为“Post”的表。

我需要查询来根据日期范围获取详细信息。我尝试了以下查询,但它抛出了一个错误。请指导我解决这个问题。提前谢谢。

select postingdate 
from post 
where TO_DATE(postingDate,'YYYY-MM-DD')>61689 
  and TO_DATE(postingDate,'YYYY-MM-DD')<61691

4 个答案:

答案 0 :(得分:1)

正如您现在所看到的,尝试对表示日期的字符串列执行任何类型的查询都是一个问题。你有几个选择:

  1. 将postdate列转换为某种DATE或TIMESTAMP数据类型。我认为这是您的最佳选择,因为它可以更快,更灵活,更不容易出错地查询表格。

  2. 将postsdate保留为字符串,并使用函数将其转换回比较时的日期。这将是一个性能问题,因为除非您的数据库支持基于函数的索引,否则大多数查询将变成全表扫描。

  3. 将postsdate保留为字符串,并将其与其他字符串进行比较。不是一个好的选择,因为很难想出一种方法来进行远程查询,就像我认为你找到的那样。

  4. 如果是我,我会转换数据。祝你好运。

答案 1 :(得分:0)

在SQL Server中,您可以说

  Select postingdate from post 
  where postingdate between '6/16/1969' and '6/16/1991'

答案 2 :(得分:0)

如果它真的是一个字符串,那么你很幸运它是YYYY-MM-DD格式。您可以将该格式排序并比较为字符串,因为最重要的数字位于左侧。例如:

select *
from Posts
where StringDateCol between '2010-01-01' and '2010-01-02'

无需将字符串转换为日期,因此以, 12:42AM IST附件不会影响比较。当然,除非您的表包含来自不同时区的日期:)

答案 3 :(得分:0)

在对其运行日期范围查询之前,您需要将字符串转换为日期。如果你对时间部分不感兴趣,你可以使用字符串。

实际功能取决于您的RDBMS

for strings only
select * from posts
where LEFT(postingDate,10) > '2010-01-21'

or
for datetime ( Sybase example)
select * from posts
where convert(DateTime,postingDate) between '2010-01-21' and '2010-01-31'