Sql 在列上获取时间,忽略文本
在数据库中,我有列我的问题是——Sql 在列上获取时间,忽略文本,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,在数据库中,我有列我的问题是—— SELECT Emp_Name, Schedule FROM emp_schedule 它重新生成此结果集: Emp_Name Schedule M.S.Cave 10:00 AM - 7:00 PM Semi Flexi M.S.Cave 10:00 AM - 7:00 PM Semi Flexi K.V.Boreta 9:00 AM - 6:00 PM Fixed K.V.Boreta 9:
SELECT Emp_Name, Schedule
FROM emp_schedule
它重新生成此结果集:
Emp_Name Schedule
M.S.Cave 10:00 AM - 7:00 PM Semi Flexi
M.S.Cave 10:00 AM - 7:00 PM Semi Flexi
K.V.Boreta 9:00 AM - 6:00 PM Fixed
K.V.Boreta 9:00 AM - 6:00 PM Fixed
R.M.Mendoza Branch 8:30 AM to 5:30 PM Sunday RD
R.M.Mendoza Branch 8:30 AM to 5:30 PM Sunday RD
但我只想显示带有时间的“时间表”列,而不考虑文本
Emp_Name Schedule
M.S.Cave 10:00 AM - 7:00 PM
M.S.Cave 10:00 AM - 7:00 PM
K.V.Boreta 9:00 AM - 6:00 PM
K.V.Boreta 9:00 AM - 6:00 PM
R.M.Mendoza 8:30 AM to 5:30 PM
R.M.Mendoza 8:30 AM to 5:30 PM
是否可以在不修剪、添加列或编辑我的表格等情况下完成此操作 试试这个
我使用了REVERSE
,PATINDEX
,子字符串来实现它。忽略CTE,因为我只想使用临时表
;WITH CTE (Emp_Name, Schedule)
AS (
SELECT 'M.S.Cave', '10:00 AM - 7:00 PM Semi Flexi'
UNION ALL
SELECT 'M.S.Cave', '10:00 AM - 7:00 PM Semi Flexi'
UNION ALL
SELECT 'K.V.Boreta', '9:00 AM - 6:00 PM Fixed'
UNION ALL
SELECT 'K.V.Boreta', '9:00 AM - 6:00 PM Fixed'
UNION ALL
SELECT 'R.M.Mendoza', 'Branch 8:30 AM to 5:30 PM Sunday RD'
UNION ALL
SELECT 'R.M.Mendoza', 'Branch 8:30 AM to 5:30 PM Sunday RD'
)
, CTE2 AS (
SELECT *
, SUBSTRING(Schedule, PATINDEX('%[0-9]%', Schedule), LEN(Schedule)) SS
FROM CTE
)
SELECT *
,REVERSE(SUBSTRING(REVERSE(SS), PATINDEX('%[0-9]%', REVERSE(SS)) - 3, LEN(SS)))
FROM CTE2
结果会是这样
+-------------+-------------------------------------+-------------------------------+--------------------+
| Emp_Name | Schedule | SS | (No column name) |
+-------------+-------------------------------------+-------------------------------+--------------------+
| M.S.Cave | 10:00 AM - 7:00 PM Semi Flexi | 10:00 AM - 7:00 PM Semi Flexi | 10:00 AM - 7:00 PM |
| M.S.Cave | 10:00 AM - 7:00 PM Semi Flexi | 10:00 AM - 7:00 PM Semi Flexi | 10:00 AM - 7:00 PM |
| K.V.Boreta | 9:00 AM - 6:00 PM Fixed | 9:00 AM - 6:00 PM Fixed | 9:00 AM - 6:00 PM |
| K.V.Boreta | 9:00 AM - 6:00 PM Fixed | 9:00 AM - 6:00 PM Fixed | 9:00 AM - 6:00 PM |
| R.M.Mendoza | Branch 8:30 AM to 5:30 PM Sunday RD | 8:30 AM to 5:30 PM Sunday RD | 8:30 AM to 5:30 PM |
| R.M.Mendoza | Branch 8:30 AM to 5:30 PM Sunday RD | 8:30 AM to 5:30 PM Sunday RD | 8:30 AM to 5:30 PM |
+-------------+-------------------------------------+-------------------------------+--------------------+
我做了如下尝试:
select Emp_name,
reverse(SUBSTRING(reverse(Schedule),charindex(' MP ',REVERSE(Schedule)),len(Schedule)))
,substring(Schedule,charindex(' AM ',Schedule)-5,charindex(' PM ',Schedule)-charindex(' AM ',Schedule)+8)
from emp_schedule
重新设计你的桌子。开始时间和结束时间各有一列。您好,贾尔赫先生,谢谢您的即时回复。我无法修改我的表,因为我对修改表有权限限制。嗯。。你真的想在不使用字符串函数的情况下解析字符串吗?为什么不TRIM
?解析字符串不是Sql的强项。这是表示层可以更好地处理的事情。非常好,它提供了精确的结果。这正是我所需要的!非常感谢,先生!你真是一件幸事!:)