如何在sql查询结果中取第一个和最后一个字符串项

时间:2017-08-19 23:54:47

标签: sql sql-server

我有一份员工入口和出口日期和时间的日志表,如下所示;

  • 11/12/2007 12:23,11 / 12/2007 21:22,...,11/12/2007 22:24
  • 12/12/2007 09:11,12 / 12/2007 11:34,...,12/12/2007 17:15
  • ...继续

项目数量不同,所有条目均以每日为基础。由于入口和出口日志,最小入口将为2。

我只想从日志中获取开始日期和结束日期。请帮我看一下T-SQL查询...

3 个答案:

答案 0 :(得分:3)

如果您使用的是Sqlserver 2005或更高版本,多次使用REVERSE函数会对性能产生不利影响,下面的代码效率会更高。

假设列名为ise logdata,表名为logTable

SELECT 
   SUBSTRING(logdata, 0, CHARINDEX(',', logdata)) AS FirstItem,
   SUBSTRING(logdata, (LEN(logdata) - CHARINDEX(',',REVERSE(logdata))+2), LEN(logdata)) AS LastItem
FROM logTable

您可以在此链接http://rextester.com/TRGHL10059

中查看确切的解决方案

答案 1 :(得分:3)

您问题的另一个简单解决方案是使用左右功能

DECLARE @str NVARCHAR(MAX)='11/12/2007 12:23,11/12/2007 21:22,11/12/2007 22:24'

SELECT LEFT(@str,CHARINDEX(',',@ str)-1), 对(@str,CHARINDEX(',',Reverse(@str))-1)

答案 2 :(得分:2)

实际上,由于所有日期时间标记都是固定数量的字符,因此您可以使用像LEFT&正确的功能......(没有必要使事情复杂化)......

IF OBJECT_ID('tempdb..#MovementLog', 'U') IS NOT NULL
DROP TABLE #MovementLog;

CREATE TABLE #MovementLog (
    LogDate DATE NOT NULL,
    ClockTimeString VARCHAR(1000) NOT NULL 
    ); 

INSERT #MovementLog (LogDate, ClockTimeString) VALUES 
    ('2007-12-11', '11/12/2007 12:23,11/12/2007 21:22,11/12/2007 22:24'),
    ('2007-12-12', '12/12/2007 09:11,12/12/2007 11:34,12/12/2007 17:15');

--==============================================================================

SELECT 
    ml.LogDate,
    BegDTStamp = LEFT(ml.ClockTimeString, 16),
    EndDTStamp = RIGHT(ml.ClockTimeString, 16)
FROM 
    #MovementLog ml;

结果...

LogDate    BegDTStamp       EndDTStamp
---------- ---------------- ----------------
2007-12-11 11/12/2007 12:23 11/12/2007 22:24
2007-12-12 12/12/2007 09:11 12/12/2007 17:15