我正在使用Sybase IQ并将以下内容存储为varchar:
01October 2010
我想使用以下格式将其从varchar转换为date数据类型:
yyyy-mm-dd eg.2010-10-01
我将如何编写此SQL语句?提前谢谢。
答案 0 :(得分: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()函数。
答案 1 :(得分:0)
Sybase能够将字符串转换为日期。因此,如果您使用substring
将日期提取为IQ可以转换的格式,那么您只需使用convert()
函数。
以下是如何操作的示例:
示例数据:
create table #tmp1 (col1 varchar(100))
insert #tmp1 values ('01October 2010')
查询将值转换为日期:
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
现在该值采用日期格式,您可以使用convert函数将date数据类型转换为字符串,使用指定的格式。 date数据类型的默认输出是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