如何通过Tsql拆分一段字符串?

时间:2016-06-16 08:12:10

标签: sql sql-server string tsql

我尝试拆分此字符串3/9/1395 12:00:00 AM并获取此字符串1395/9/3。我搜索但是sql没有这项工作的方法。怎么做?

4 个答案:

答案 0 :(得分:3)

您可以将变量转换为日期并获取年,月和日

DATEPART(YEAR,Cast('3/9/1395 12:00:00 AM' as date)) 

DATEPART(MONTH,Cast('3/9/1395 12:00:00 AM' as date)) 

DATEPART(DAY,Cast('3/9/1395 12:00:00 AM' as date))

https://msdn.microsoft.com/en-us/library/ms174420.aspx

答案 1 :(得分:2)

好的,这是一种真正的hacky方式,可以用于您需要拆分的日期值。有更简单的方法来回答这个特定的问题,因为它与日期有关,但对于一般的字符串拆分,你可以采用这种方法;

测试数据;

CREATE TABLE #TestData (OriginalString varchar(22))
INSERT INTO #TestData (OriginalString)
VALUES
('3/9/1395 12:00:00 AM')
,('10/9/1462 04:00:00 AM')
,('25/12/1900 15:00:00 PM')
,('3/11/1264 13:00:00 PM')

结果查询;

SELECT
OriginalString
,RIGHT(LEFT(OriginalString,CHARINDEX(' ',OriginalString,1)-1),4) + '/' + RIGHT(LEFT(OriginalString,CHARINDEX('/',OriginalString,CHARINDEX('/',OriginalString,1)+1)-1),LEN(LEFT(OriginalString,CHARINDEX('/',OriginalString,CHARINDEX('/',OriginalString,1)+1)-1))-CHARINDEX('/',OriginalString,1)) + '/' + LEFT(OriginalString,CHARINDEX('/',OriginalString,1)-1) Result
FROM #TestData

给出了这些结果;

OriginalString          Result
3/9/1395 12:00:00 AM    1395/9/3
10/9/1462 04:00:00 AM   1462/9/10
25/12/1900 15:00:00 PM  1900/12/25
3/11/1264 13:00:00 PM   1264/11/3

为了得到这个结果,我逐个部分地构建了结果并从那里开始工作,如果你看看下面的查询,你可以看到我是如何得到这个答案的,如果你需要这样做,它可能对你有所帮助将来再次;

SELECT
OriginalString
,CHARINDEX('/',OriginalString,1) FirstSlashLocation
,LEFT(OriginalString,CHARINDEX('/',OriginalString,1)-1) FirstValue
,CHARINDEX('/',OriginalString,CHARINDEX('/',OriginalString,1)+1) SecondSlashLocation
,RIGHT(LEFT(OriginalString,CHARINDEX('/',OriginalString,CHARINDEX('/',OriginalString,1)+1)-1),LEN(LEFT(OriginalString,CHARINDEX('/',OriginalString,CHARINDEX('/',OriginalString,1)+1)-1))-CHARINDEX('/',OriginalString,1)) SecondValue
,CHARINDEX(' ',OriginalString,1) SpaceLocation
,RIGHT(LEFT(OriginalString,CHARINDEX(' ',OriginalString,1)-1),4) FinalValue
,RIGHT(LEFT(OriginalString,CHARINDEX(' ',OriginalString,1)-1),4) + '/' + RIGHT(LEFT(OriginalString,CHARINDEX('/',OriginalString,CHARINDEX('/',OriginalString,1)+1)-1),LEN(LEFT(OriginalString,CHARINDEX('/',OriginalString,CHARINDEX('/',OriginalString,1)+1)-1))-CHARINDEX('/',OriginalString,1)) + '/' + LEFT(OriginalString,CHARINDEX('/',OriginalString,1)-1) Result
FROM #TestData

给出了这些结果;

OriginalString          FirstSlashLocation  FirstValue  SecondSlashLocation SecondValue SpaceLocation   FinalValue  Result
3/9/1395 12:00:00 AM    2                   3           4                   9           9               1395        1395/9/3
10/9/1462 04:00:00 AM   3                   10          5                   9           10              1462        1462/9/10
25/12/1900 15:00:00 PM  3                   25          6                   12          11              1900        1900/12/25
3/11/1264 13:00:00 PM   2                   3           5                   11          10              1264        1264/11/3

答案 2 :(得分:1)

如果您的列是日期,则可以使用

select  CONVERT(VARCHAR(20),your_column , 110) from your_table

答案 3 :(得分:1)

如果你的DBMS是Sql Server(我想你的标题是你写的Tsql)

试试这个:

select 
    substring('3/9/1395 12:00:00 AM', 0, 
    charindex(' ', '3/9/1395 12:00:00 AM')
)

您的模式始终是日期空间时间,因此您将获得第一个空格位置(使用charindex函数)并在字符串上应用substring函数