1

在称为描述的表中有一个文本文件。当使用 sql server 2005 存储过程出现“~”字符时,我想从该字符串中提取两个日期字段。在这种情况下帮助我。

示例:字符串:'租赁租赁;10/12 ~ 10/31/2012'。在出现 ~ 运算符时,我希望拥有从日期:20121001 和到日期:20121031。

4

4 回答 4

0

在这种情况下,您可以使用以下内容,但实际上您需要一个 exists 子句或类似的东西来测试波浪号 (~) 的字符串,正如其他所有人所说,这仅在字符串始终具有分号 (;) 和波浪号(~)。如果需要,您可以将字符串转换为日期时间字段。我已将字符串放在变量中以使其更易于阅读...

将@string 声明为 NVARCHAR(255)

SET @string = '延期租赁;10/1012 ~ 1/0/31/2012'

SELECT StartDate = SUBSTRING(@string,CHARINDEX(';',@string)+1,LEN(@string)-CHARINDEX('~',@string)-1) ,EndDate = LTRIM(RIGHT(@string,LEN( @string)-CHARINDEX('~',@string)))

于 2012-10-22T10:14:22.313 回答
0

这是一个给出开始和结束日期的方法。我保留了大部分测试选择,但注释掉了。

DECLARE @string AS NVARCHAR(255)
DECLARE @Seperator as char(1) = '~'
declare @CharStartDate as varchar(10)
declare @CharStopDate as varchar(10)
declare @StartDate as date
declare @StopDate as date

declare @I int

--SET @string = 'xvvvvvvcc;1/09/2012 ~ 1/10/2012xx'
--SET @string = 'xvvvvvvcc;12/31/2012 ~ 1/1/2012xx'
--SET @string = 'xvvvvvvcc;12/1/2012 ~ 10/0/2012xx'
SET @string = 'xvvvvvvcc;1/2/2012 ~ 1/3/2012xx'
--longest date 12/31/2011 = 10
--shortest date 1/1/2012 = 8
-- width of seperator = 3 

SELECT 
@CharStartDate = substring (@string, CHARINDEX(@Seperator,@string)-11,10)
,@CharStopDate = substring (@string, CHARINDEX(@Seperator,@string)+2,10)

--SELECT  @CharStartDate,@CharStopDate

select @I = ascii(substring(@CharStartDate,1,1))
While @I > 57
BEGIN
set @CharStartDate = substring(@CharStartDate,2,10)
--select @CharStartDate
select @I = ascii(substring(@CharStartDate,1,1))
END

select @I = ascii(substring(REVERSE(@CharStopDate),1,1))
While @I > 57
BEGIN
set @CharStopDate = REVERSE(substring(REVERSE(@CharStopDate),2,10))
--select @CharStopDate
select @I = ascii(substring(REVERSE(@CharStopDate),1,1))
END

--select ascii(';'),ascii('9'),ascii('8'),ascii('7'),ascii('6'),ascii('6'),ascii('4'),ascii('3'),ascii('2'),ascii('1'),ascii('0')
SELECT  @StartDate = @CharStartDate,@StopDate = @CharStopDate
--SELECT  @I,@string,@Seperator,@CharStartDate,@CharStopDate,@StartDate,@StopDate
select datediff(dd,@StartDate,@StopDate) AS 'DateDiff',@StartDate as 'Start Date',@StopDate as 'Stop Date'

我会把它留给你检查分隔符。

于 2012-10-22T21:25:39.627 回答
0
CREATE FUNCTION [dbo].[RemoveAlphaCharacters](@Temp nvarchar(max))
RETURNS nvarchar(max)
AS
BEGIN
  WHILE PatIndex ('%[^0-9~/]%', @Temp) > 0
  SET @Temp = Stuff(@Temp, PatIndex('%[^0-9~/]%', @Temp), 1, '')
  RETURN @Temp
END

DECLARE @string nvarchar(max) = '长期租金;10/1/2012 ~ 10/31/2012'
SELECT CONVERT(date, SUBSTRING([dbo].[RemoveAlphaCharacters](@string), 0,
       CHARINDEX('~', [dbo].[RemoveAlphaCharacters](@string))), 101) AS BDate,
       CONVERT(date, SUBSTRING([dbo].[RemoveAlphaCharacters](@string),
       CHARINDEX('~', [dbo].[RemoveAlphaCharacters](@string)) + 1,
       CHARINDEX('~', REVERSE([dbo].[RemoveAlphaCharacters](@string)))), 101) AS EDate
于 2012-11-10T23:05:47.667 回答
-2

我从未使用过旧版本的 SQL,因为我刚毕业,但它没有 EXTRACT() 函数吗?.. 语法如下所示。

SELECT First_Name ,    
  
    EXTRACT ( CAST(Created_date AS DATE) FROM Created_date ) AS Date_only ;

您指定“First_name”以让 SQL 知道您希望将其作为一列,并且“created_date”是您尝试从中分隔日期的字段。cast 函数在提取之前将您的字段转换为 DATE 值。

我希望这有帮助 。谢谢你。如果我错了,请告诉我我想提高自己。

于 2021-05-29T14:18:31.223 回答