日期的SQL正则表达式

时间:2019-03-04 07:35:17

标签: sql sql-server

我想使用SQL Server中的正则表达式仅获取日期。以下是我的行值。我只想获取日期部分。

'JACKSONVILLE, FL                  2019-02-01 10:00:03 EST'
'JACKSONVILLE, FL       abc        2019-02-01 10:00:03 EST'

按此顺序,数据存储在表行中。记录的长度可能会有所不同。请建议

4 个答案:

答案 0 :(得分:0)

如果记录具有固定长度,那将是使用left(...)和right(..)的最佳方法

select left(right('JACKSONVILLE, FL                  2019-02-01 10:00:03 EST', 23), 19)

答案 1 :(得分:0)

SQL Server对正则表达式的支持不是最好的,但是我相信这会起作用

SELECT SUBSTRING(column, PATINDEX('%[1-2][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]%', column),LEN(column))

答案 2 :(得分:0)

PATINDEX可以与SUBSTRING结合使用以获取时间戳子字符串。

如果要将其转换为带有时区的datetime类型,则可以使用下面的Sql Snippet之类的方法。
假设这些都在EST时区中。

select 

SUBSTRING(col, 
          PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [A-Z][A-Z][A-Z]%', col)
          ,23) as timestamp_string,

(CONVERT(DATETIME2(0), 
   SUBSTRING(col, 
             PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] EST%', col),
             19))
   AT TIME ZONE 'Eastern Standard Time') as timestamp_string_as_datetime2

from 
(values 
 ('JACKSONVILLE, FL       2019-02-01 11:00:03 EST'),
 ('JACKSONVILLE, FL  abc  2019-02-01 12:00:03 EST cdf ')
) v(col)

答案 3 :(得分:0)

sql sever 不支持正则表达式,类似模式是对模式的基本支持而不是正则表达式,但下面可以检查很多模式。 在此查询中,所有月份都被视为 31 天。

SELECT * FROM TableName
WHERE 
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-0[0-9]-0[1-9]%'  or
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-0[0-9]-[1-2][0-9]%'  or
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-0[0-9]-3[0-1]%' OR
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-1[0-2]-0[1-9]%'  or
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-1[0-2]-[1-2][0-9]%'  or
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-1[0-2]-3[0-9]%' Or

如果月或天可以有数字,你也应该添加这个条件

DateFild  LIKE '%[1-2][0-9][0-9][0-9]-[0-9]-0[1-9]%'  or
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-[0-9]-[1-9]%'  or
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-[0-9]-[1-2][0-9]%'  or
DateFild  LIKE '%[1-2][0-9][0-9][0-9]-[0-9]-3[0-1]%'