SQL Varchar 转换为日期 - Sybase
SQL Varchar convert to Date - Sybase
我正在使用 Sybase IQ 并将以下内容存储为 varchar:
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() 函数。
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 函数将日期数据类型转换为字符串,使用您指定的格式。日期数据类型的默认输出已经是 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
我正在使用 Sybase IQ 并将以下内容存储为 varchar:
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() 函数。
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 函数将日期数据类型转换为字符串,使用您指定的格式。日期数据类型的默认输出已经是 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