SQL Server:在SELECT语句中拆分字符串

时间:2014-04-28 12:22:21

标签: sql sql-server substring

我想在3个字段的列中分割日期,我使用此查询

SELECT  
SUBSTRING(Account.date, 1, 2) AS "Month",
SUBSTRING(Account.date, 4, 2) AS "Day",
SUBSTRING(Account.date, 7, 4) AS "Year"
FROM Account

几乎所有数据都采用02/11/2000格式,但有些数据可以是02/November/20002/11/2000

唯一常见的是由/分隔的数据。如何使用分隔符分隔此列?

6 个答案:

答案 0 :(得分:4)

令人惊讶CAST('2/November/2000' as datetime)有效(在SQL Server 2008上查看),给出值 2000-11-02 00:00:00.000

SELECT  
Month(CAST(Account.date AS DateTime)) "Month",
Day(CAST(Account.date AS DateTime)) "Day",
Year(CAST(Account.date AS DateTime)) "Year",

FROM Account

但正如评论中正确指出的,你如何知道“02/11/2000”是2000年11月2日还是2000年2月11日?

月份名称的拼写必须绝对正确,否则转换失败。由于您将日期存储为字符串,因此可能会像11月,Agust等一样进入。

您永远不应将日期值存储为字符串。

答案 1 :(得分:3)

您可以使用CHARINDEXSUBSTRING函数

以此方式执行此操作
select 
    LEFT(Account.date, CHARINDEX('/', Account.date) - 1),
    SUBSTRING(Account.date, CHARINDEX('/', Account.date) + 1, LEN(Account.date) - CHARINDEX('/', Account.date) - CHARINDEX('/', Account.date, CHARINDEX('/', Account.date)) - 2),
    REVERSE(LEFT(REVERSE(Account.date), CHARINDEX('/', REVERSE(Account.date)) - 1))
FROM Account

答案 2 :(得分:1)

您可以稍微滥用PARSENAME功能:

SELECT  FirstPart = PARSENAME(REPLACE(Account.Date, '/', '.'), 3),
        SecondPart = PARSENAME(REPLACE(Account.Date, '/', '.'), 2),
        ThirdPart = PARSENAME(REPLACE(Account.Date, '/', '.'), 1)
FROM    (VALUES
            ('02/November/2000'),
            ('2/11/2000')
        ) Account (Date);

会给:

FirstPart   SecondPart  ThirdPart
02          November    2000
2           11          2000

但是,我强烈推荐storing your dates using the appropriate data type!。 SQL Server 2012具有TRY_CONVERT功能,可以使这种转换更容易,但您仍需要知道字符串日期的格式,2/11/2000可能是11月2日或2月11日,具体取决于您所在地区设置。

答案 3 :(得分:0)

您可以在SQL中使用CharIndex和Substring函数的组合来根据分隔符拆分字符串。

您可以在此处查看CharIndex示例SQL Server 2005 Using CHARINDEX() To split a string 在这里SQL Server - find nth occurrence in a string

答案 4 :(得分:0)

假设您的数据库列account.date包含有效的datetimedate值,您应该使用SQLServers日期函数,如:

select month(getDate()) as "Month", 
       day(getDate()) as "Day", 
       year(getDate()) as "Year"

我将您的列account.date替换为getDate()以获得一些测试值。这将按以下方式映射到您的SQL

SELECT  
month(Account.date) AS "Month",
day(Account.date) AS "Day",
year(Account.date) AS "Year"
FROM Account

将这些日期值存储为varchars将是IMHO数据库结构的设计缺陷。日期以多种方式格式化为文本。这是数据库数据的表示。要处理数据,您始终会预处理文本日期。这是不好的做法。

如果你确实有varchar值,那么有几个SO问题,例如:How do I split a string so I can access item x?

答案 5 :(得分:0)

试试这个:

DECLARE @VALUE VARCHAR(100)<BR>
SET @VALUE ='2/11/2000' <BR>
SELECT SUBSTRING(@VALUE,0,CHARINDEX('/',@VALUE,0)),

SUBSTRING(@VALUE,
CHARINDEX('/',@VALUE,0)+1,

(CHARINDEX('/',@VALUE,(CHARINDEX('/',@VALUE,0)+1)) - 
CHARINDEX('/',@VALUE,0) - 1)

),RIGHT(@VALUE,4)