我使用Sybase IQ,并将以下内容作为varchar存储:
01October 2010
我想用以下格式将其从varchar转换为date数据类型:
yyyy-mm-dd eg.2010-10-01
我将如何编写这个SQL语句?提前谢谢。
发布于 2017-06-29 15:38:43
困难重重。你不应该将日期和时间存储为字符串是有原因的。
我已经有一段时间没有使用Sybase了,但是我们需要做的是将字段转换为YYYY 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()函数。
发布于 2017-06-29 17:04:09
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
既然该值是日期格式的,则可以使用转换函数使用指定的格式将日期数据类型转换为字符串。日期数据类型的默认输出已经是yyyy了。
编辑:在查看@BaconBits的答案之后,我意识到我可以通过使用子字符串函数wrappers 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
https://stackoverflow.com/questions/44829102
复制相似问题