2017-06-29 185 views
0

我使用Sybase IQ和具有下列存储为VARCHAR:SQL的Varchar转换为日期 - 的Sybase

01October 2010 

我想这个从varchar下面的格式转换为date数据类型:

yyyy-mm-dd eg.2010-10-01 

我该如何编写这条SQL语句?提前致谢。

+0

日期没有格式,所以第二点是无关紧要的。 – Siyual

+0

你的月份格式(mmm)和样本数据(10)不匹配; 'mmm'是本月的3个字母的缩写(例如,10月),而您显示您需要2位数字(10);这是你想要的吗?无论如何,请参阅IQ参考手册中的转换()函数以获取详细信息 – markp

+0

我已更新原始问题。我已阅读文档,但挣扎...任何想法?我试过这个: SELECT CONVERT(VARCHAR,visit_date,106)FROM tablename 但得到这个错误:数据类型转换是不可能的。 CONVERT参数与所需的数据类型不匹配。 –

回答

0

有困难。有一个原因,你不应该把日期和时间存储为字符串。

自从我使用Sybase以来已经有一段时间了,但我们需要做的是将字段转换为YYYY-MM-DD格式,然后将其传递给DATE()或DATETIME()函数。

让我们假设前两个字符总是一个月的一天,最后4个字符是年份。这意味着两者之间的一切都是一个月。我们还假设没有前导或尾随空格。如果这些假设中的任何一个失败,那么查询将失败。

然后,你可以做这样的事情:

SELECT DATE (
     RIGHT(UnnamedField,4) + '-' + 
     CASE LTRIM(RTRIM(SUBSTRING(Unnamed,3,LEN(Unnamed) - 6))) 
      WHEN 'January' THEN '01' 
      WHEN 'February' THEN '02' 
      WHEN 'March' THEN '03' 
      . 
      . 
      . 
      WHEN 'December' THEN '12' 
     END + '-' + LEFT(UnnamedField,2) 
    ) 
FROM UnnamedTable 

需要注意的是,正如其他人所提到的,日期数据类型不是格式化的数据类型。如果可能,你应该在你的应用程序中格式化它如果您必须在查询中执行此操作,请使用CONVERT()函数。

+0

感谢分享 - 我试过了,得到了空值......任何想法为什么? –

+0

我已经更新,删除所有空格:01October2010 –

+0

@NickEdwards尝试分开表达式,看看你得到了什么。做'SELECT RIGHT(UnnamedField,4)AS Year,LEFT(UnnamedField,2)AS Day,....'看看每个字段在做什么。您可能会获取NULL,因为一个或多个值是空值。 –

0

Sybase能够将字符串转换为日期。因此,如果您使用substring将日期提取为IQ可以转换的格式,那么您可以使用convert()函数。

下面是如何做到这一点的例子:

的样本数据:

select 
    convert 
    (
     date, 
     (
      substring(col1, 3, charindex(' ', col1) - 2) -- Month 
      + substring(col1, 1, 2) -- Day 
      + substring(col1, charindex(' ', col1), 5) -- Year (include the leading space) 
     ) 
    ) 
from #tmp1 

现在,该值在:

create table #tmp1 (col1 varchar(100)) 
insert #tmp1 values ('01October 2010') 

查询到的值的日期转换日期格式,可以使用convert函数将日期数据类型转换为字符串,并使用指定的格式。日期数据类型的默认输出已经是yyyy-mm-dd。


编辑:考虑看看@BaconBits'的答案后,我意识到,我可以使用子功能包装leftright,和date转换包装简化查询了一下。这是一样的逻辑;但使用简化的包装可能会使其更易于理解。

select 
    date 
     (
      substring(col1, 3, charindex(' ', col1) - 2) -- Month 
      + left(col1, 2) -- Day 
      + ' ' + right(col1, 4) -- Year (include the leading space) 
     ) 
from #tmp1 
+0

谢谢 - 我只是复制和粘贴上面,它不会返回任何东西...任何想法我要去哪里错了? –

+0

@NickEdwards它没有提供任何错误或任何内容?它只是返回一个空白值的列?当我测试它时,它工作正常。您是使用我创建的测试表,还是修改它以与您的表一起使用?如果你正在使用我的测试表,你可以从#tmp1中选择*来确保插入了一条记录吗? – RToyo