如何使用SQL Server进行拆分?

时间:2013-03-26 01:10:42

标签: sql sql-server tsql

我想在SQL Server中拆分2009-02-27 14:30:53,使其转向:

Y     M   D   T
-----------------------
2009  02  27  14:30:53

任何人都可以使用“Substring”和“Charindex”帮助我这样做吗?

2 个答案:

答案 0 :(得分:5)

您应该能够使用以下使用DATEPART功能和convert of the date来返回时间:

select
  datepart(year, yourDate) y,
  datepart(month, yourDate) m,
  datepart(day, yourDate) d,
  convert(char(8), yourdate, 108) t
from yourtable

请参阅SQL Fiddle with Demo

这也可以写成使用YEARMONTHDAY函数:

select
  year(yourDate) y,
  month(yourDate) m,
  day(yourDate) d,
  convert(char(8), yourdate, 108) t
from yourtable

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

非常同意如果您是学生,您需要自己思考。如果您是学生,这不是正确的学习方式,您应该尝试自己做,研究并与同行交谈。如果你是一名学生,这种态度会导致当今市场上大量蹩脚的程序员。

但是如果您是一名正在寻找解决方案的工作成年人,那么我碰巧有一个通用的StrSplit()函数。您可以像使用它一样使用它:

SELECT * FROM dbo.StrSplit('91,12,65,78,56,789',',')

或者您可以将它用于您的目的:

SELECT  (SELECT Element FROM dbo.StrSplit('2009-02-27','-') WHERE rowid=0) AS Y
        , (SELECT Element FROM dbo.StrSplit('2009-02-27','-') WHERE rowid=1) AS M
        , (SELECT Element FROM dbo.StrSplit('2009-02-27','-') WHERE rowid=2) AS D
        , (SELECT Element FROM dbo.StrSplit('14:30:53',':') WHERE rowid=0) AS H
        , (SELECT Element FROM dbo.StrSplit('14:30:53',':') WHERE rowid=1) AS M
        , (SELECT Element FROM dbo.StrSplit('14:30:53',':') WHERE rowid=2) AS S

这是定义:

CREATE FUNCTION dbo.StrSplit ( @pvsString VARCHAR(MAX), @pvsSeparator CHAR(1) )
RETURNS @fnorsList TABLE ([rowid] INT, [Element] NVARCHAR(500))
AS
BEGIN
    DECLARE @vsElement NVARCHAR(255)
    DECLARE @viPos INT
    DECLARE @viRow INT SET @viRow = 0

    WHILE CHARINDEX( @pvsSeparator, @pvsString) > 0
    BEGIN
        SELECT @viPos  = CHARINDEX(@pvsSeparator, @pvsString)  
        SELECT @vsElement = SUBSTRING(@pvsString, 1, @viPos-1)

        INSERT INTO @fnorsList ([rowid], [Element]) SELECT @viRow, @vsElement
        SELECT @pvsString = SUBSTRING(@pvsString, @viPos+1, LEN(@pvsString)-@viPos)
        SET @viRow = @viRow + 1
    END
    INSERT INTO @fnorsList ([rowid], [Element]) SELECT @viRow, @vsElement
    RETURN
END