SQL的Varchar转换为日期 - 的Sybase
我使用Sybase IQ和具有下列存储为VARCHAR:SQL的Varchar转换为日期 - 的Sybase
01October 2010
我想这个从varchar下面的格式转换为date数据类型:
yyyy-mm-dd eg.2010-10-01
我该如何编写这条SQL语句?提前致谢。
有困难。有一个原因,你不应该把日期和时间存储为字符串。
自从我使用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()函数。
感谢分享 - 我试过了,得到了空值......任何想法为什么? –
我已经更新,删除所有空格:01October2010 –
@NickEdwards尝试分开表达式,看看你得到了什么。做'SELECT RIGHT(UnnamedField,4)AS Year,LEFT(UnnamedField,2)AS Day,....'看看每个字段在做什么。您可能会获取NULL,因为一个或多个值是空值。 –
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'的答案后,我意识到,我可以使用子功能包装left
,right
,和date
转换包装简化查询了一下。这是一样的逻辑;但使用简化的包装可能会使其更易于理解。
select
date
(
substring(col1, 3, charindex(' ', col1) - 2) -- Month
+ left(col1, 2) -- Day
+ ' ' + right(col1, 4) -- Year (include the leading space)
)
from #tmp1
谢谢 - 我只是复制和粘贴上面,它不会返回任何东西...任何想法我要去哪里错了? –
@NickEdwards它没有提供任何错误或任何内容?它只是返回一个空白值的列?当我测试它时,它工作正常。您是使用我创建的测试表,还是修改它以与您的表一起使用?如果你正在使用我的测试表,你可以从#tmp1中选择*来确保插入了一条记录吗? – RToyo
日期没有格式,所以第二点是无关紧要的。 – Siyual
你的月份格式(mmm)和样本数据(10)不匹配; 'mmm'是本月的3个字母的缩写(例如,10月),而您显示您需要2位数字(10);这是你想要的吗?无论如何,请参阅IQ参考手册中的转换(,,)函数以获取详细信息 –
markp
我已更新原始问题。我已阅读文档,但挣扎...任何想法?我试过这个: SELECT CONVERT(VARCHAR,visit_date,106)FROM tablename 但得到这个错误:数据类型转换是不可能的。 CONVERT参数与所需的数据类型不匹配。 –