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

问题描述 投票:1回答:6

我想在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

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

sql sql-server substring
6个回答
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等一样的条目。

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


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

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日,具体取决于您的区域设置。


0
投票

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

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


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?


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)
© www.soinside.com 2019 - 2024. All rights reserved.