佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2367|回复: 30

Ms SQL Server 2005 如何用subtring才能解决我找出日期?

[复制链接]
发表于 30-10-2008 08:04 PM | 显示全部楼层 |阅读模式
CREATE TABLE #TEMP
(
        [No] [varchar](1) NULL,
        [Sign Date] [varchar](50)         
)

INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Ce.He 10/15/2008 4:13 PM');
INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Wee.Wee 1/1/2008 9:24 AM');
INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Hi.Na 10/16/2008 10:12 AM');
INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Ci.Wai 10/1/2008 4:01 AM');

SELECT 'Sign Date' = CONVERT(VARCHAR(19), LTRIM(RTRIM(SUBSTRING([Sign Date],LEN([Sign Date])-18, LEN([Sign Date])))), 120) FROM #TEMP

DROP TABLE #TEMP


如何用subtring才能解决我找出日期?
我走头无路了
谁可以救救我呢?
谢谢
回复

使用道具 举报


ADVERTISEMENT

发表于 31-10-2008 10:43 AM | 显示全部楼层
应该把日期分开储存,要不然就把日期设置成固定长度, 比如 :01/01/2008 09:24 AM
回复

使用道具 举报

 楼主| 发表于 31-10-2008 02:25 PM | 显示全部楼层
原帖由 神仙祖宗 于 31-10-2008 10:43 AM 发表
应该把日期分开储存,要不然就把日期设置成固定长度, 比如 :01/01/2008 09:24 AM


因为third party,我无法更改
惟有走一步看一部
回复

使用道具 举报

发表于 31-10-2008 03:05 PM | 显示全部楼层
那么只有试试这个

SELECT 'Sign Date' = CONVERT(VARCHAR(19), LTRIM(RTRIM(SUBSTRING([Sign Date],CHARINDEX(' ',[Sign Date]), LEN([Sign Date])))), 120) FROM #TEMP


条件是在日期前面只有唯一的一个空格

比如 'Ce. He 10/15/2008 4:13 PM' 就不能用鸟 (He前面有空格)
回复

使用道具 举报

发表于 31-10-2008 07:37 PM | 显示全部楼层
原帖由 musxell 于 30-10-2008 08:04 PM 发表


如何用subtring才能解决我找出日期?
我走头无路了
谁可以救救我呢?
谢谢


我用了很白痴的方法
写一个Function

  1. DECLARE @input varchar(50)
  2. DECLARE @length int
  3. DECLARE @i int
  4. DECLARE @count int

  5. SET @input = 'Ce He 10/15/2008 4:13 PM'
  6. SET @length = len(@input)
  7. SET @count = 0
  8. SET @i=@length

  9. WHILE @i>0
  10. BEGIN
  11. IF SUBSTRING(@input, @i, 1) = ' '
  12. BEGIN
  13. SET @count = @count + 1
  14. IF @count = 3
  15. BEGIN
  16. SELECT CAST(SUBSTRING(@input, @i+1, @length-@i+1) AS DATETIME)
  17. END

  18. END
  19. SET @i = @i - 1
  20. END
复制代码
回复

使用道具 举报

发表于 1-11-2008 11:00 AM | 显示全部楼层
Convert(varchar, <column name>, 101) AS <your new column name>
回复

使用道具 举报

Follow Us
发表于 3-11-2008 01:43 AM | 显示全部楼层
Ms SQL Server 的 SQL interpretor 有 regex 功能吗?
回复

使用道具 举报

 楼主| 发表于 3-11-2008 08:30 AM | 显示全部楼层
原帖由 神仙祖宗 于 31-10-2008 03:05 PM 发表
那么只有试试这个

SELECT 'Sign Date' = CONVERT(VARCHAR(19), LTRIM(RTRIM(SUBSTRING([Sign Date],CHARINDEX(' ',[Sign Date]), LEN([Sign Date])))), 120) FROM #TEMP


条件是在日期前面只有唯一的一个空格 ...


好的谢谢我只能走一步看一步

原帖由 sfkwan 于 31-10-2008 07:37 PM 发表


我用了很白痴的方法
写一个Function

DECLARE @input varchar(50)
DECLARE @length int
DECLARE @i int
DECLARE @count int

SET @input = 'Ce He 10/15/2008 4:13 PM'
SET @length = len(@input)
SET ...


这个是store procedure?
那我select的时候怎么用这个function?
新手上路谢谢
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 3-11-2008 08:32 AM | 显示全部楼层
原帖由 tensaix2j 于 3-11-2008 01:43 AM 发表
Ms SQL Server 的 SQL interpretor 有 regex 功能吗?


这个是什么来得?
回复

使用道具 举报

发表于 3-11-2008 02:12 PM | 显示全部楼层
原帖由 musxell 于 3-11-2008 08:32 AM 发表


这个是什么来得?


Regular Expression

我只会 copy & paste 来用而已

可以看看这里 http://en.wikipedia.org/wiki/Regular_expression
回复

使用道具 举报

发表于 4-11-2008 09:01 AM | 显示全部楼层
原帖由 musxell 于 3-11-2008 08:30 AM 发表


好的谢谢我只能走一步看一步



这个是store procedure?
那我select的时候怎么用这个function?
新手上路谢谢

我也是新手
  1. CREATE FUNCTION functionName
  2. (
  3.      @input varchar(50)
  4. )
  5. RETURNS DATETIME
  6. AS
  7. BEGIN

  8. DECLARE @length INT
  9. DECLARE @i INT
  10. DECLARE @count INT
  11. DECLARE @result DATETIME

  12. SET @length = LEN(@input)
  13. SET @count = 0
  14. SET @i=@length

  15. WHILE @i>0
  16. BEGIN
  17.     IF SUBSTRING(@input, @i, 1) = ' '
  18.     BEGIN
  19.         SET @count = @count + 1
  20.         IF @count = 3
  21.         BEGIN
  22.             SELECT @result = CAST(SUBSTRING(@input, @i+1, @length-@i+1) AS DATETIME)
  23.         END
  24.     END
  25.     SET @i = @i - 1
  26. END
  27. RETURN @result
  28. END
复制代码
先Create 这个 Function (换掉FunctionName)
然后当你需要处理那个input(架设是 'Ce He 10/15/2008 4:13 PM')
只要Call 这个 Function 即可 (Select dbo.FunctionName('Ce He 10/15/2008 4:13 PM'))
  1. CREATE TABLE #TEMP
  2. (
  3.         [No] [varchar](1) NULL,
  4.         [Sign Date] [varchar](50)         
  5. )

  6. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Ce.He 10/15/2008 4:13 PM');
  7. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Wee.Wee 1/1/2008 9:24 AM');
  8. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Hi.Na 10/16/2008 10:12 AM');
  9. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Ci.Wai 10/1/2008 4:01 AM');

  10. SELECT dbo.functionName([Sign Date]) as 'Sign Date' from #TEMP

  11. DROP TABLE #TEMP
复制代码

[ 本帖最后由 sfkwan 于 4-11-2008 09:03 AM 编辑 ]
回复

使用道具 举报

发表于 4-11-2008 02:11 PM | 显示全部楼层
原帖由 tensaix2j 于 3-11-2008 01:43 AM 发表
Ms SQL Server 的 SQL interpretor 有 regex 功能吗?



MSSQL 2005 有Regular Expression,确实可以做Data extraction
不过我不会,而且我没有MSSQL 2005
回复

使用道具 举报

 楼主| 发表于 7-11-2008 01:02 PM | 显示全部楼层
原帖由 sfkwan 于 4-11-2008 09:01 AM 发表

我也是新手
CREATE FUNCTION functionName
(
     @input varchar(50)
)
RETURNS DATETIME
AS
BEGIN

DECLARE @length INT
DECLARE @i INT
DECLARE @count INT
DECLARE @result DATETIME

SET ...


一点也看不出你是新手哦
谢谢你哈
回复

使用道具 举报

发表于 7-11-2008 02:24 PM | 显示全部楼层
原帖由 musxell 于 7-11-2008 01:02 PM 发表


一点也看不出你是新手哦
谢谢你哈



不客气
两个星期前刚开始用MSSQL,去年年头曾经用过一段时间
现在很常打错query,因为用惯了Oracle sql
现在正在努力着Debug 和Performance tuning, 开始被Client 追了
你试下用 Regular Expression, 我想应该会比较适合
回复

使用道具 举报

发表于 7-11-2008 02:56 PM | 显示全部楼层
原帖由 sfkwan 于 4-11-2008 09:01 AM 发表

我也是新手
CREATE FUNCTION functionName
(
     @input varchar(50)
)
RETURNS DATETIME
AS
BEGIN

DECLARE @length INT
DECLARE @i INT
DECLARE @count INT
DECLARE @result DATETIME

SET ...


这个会比较简单

  1. CREATE FUNCTION functionName

  2. (

  3.      @input varchar(50)

  4. )

  5. RETURNS DATETIME

  6. AS

  7. BEGIN



  8. DECLARE @rev VARCHAR(50)

  9. SET @rev = REVERSE(@input)



  10. RETURN SELECT CAST(REVERSE(SUBSTRING(@rev, 0, charindex(' ',@rev, CHARINDEX('/', @rev,0)))) AS DATETIME)





  11. END
复制代码
回复

使用道具 举报

 楼主| 发表于 10-11-2008 09:04 AM | 显示全部楼层
原帖由 sfkwan 于 7-11-2008 02:24 PM 发表



不客气
两个星期前刚开始用MSSQL,去年年头曾经用过一段时间
现在很常打错query,因为用惯了Oracle sql
现在正在努力着Debug 和Performance tuning, 开始被Client 追了
你试下用 Reg ...


regular expression 和vb.net的一样吗?
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20081105095020KDT&fumcde=
你看上面的link一下
几乱下
到底regular expression好还是不好?



原帖由 sfkwan 于 7-11-2008 02:56 PM 发表


这个会比较简单

CREATE FUNCTION functionName

(

     @input varchar(50)

)

RETURNS DATETIME

AS

BEGIN


DECLARE @rev VARCHAR(50)

SET @rev = REVERSE(@input)


RETURN SELECT CAST(REVERSE(SUBSTRING(@rev, 0, charindex(' ',@rev, CHARINDEX('/', @rev,0)))) AS DATETIME)

END


cari果然多人才
谢谢哦
回复

使用道具 举报


ADVERTISEMENT

发表于 11-11-2008 12:46 AM | 显示全部楼层
原帖由 musxell 于 10-11-2008 09:04 AM 发表


regular expression 和vb.net的一样吗?
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20081105095020KDT&fumcde=
你看上面的link一下
几乱下
到底regular expression好还是不好?

...


据我所用过的,好像都不是统一的
每个都有自己的写法
用Regular expression作Validation是最容易的
Web programmer 应该都会
我没有装MSSQL 2005,所以我没办法试,你摸索了然后告诉我
回复

使用道具 举报

 楼主| 发表于 13-11-2008 12:33 PM | 显示全部楼层
原帖由 sfkwan 于 11-11-2008 12:46 AM 发表


据我所用过的,好像都不是统一的
每个都有自己的写法
用Regular expression作Validation是最容易的
Web programmer 应该都会
我没有装MSSQL 2005,所以我没办法试,你摸索了然后告诉我


好的,没问题
时隔多日,我又有SQL的问题
  1. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Ce.He 15/10/2008 4:13');
  2. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Wee.Wee 1/1/2008 9:24');
  3. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Hi.Na 15/12/2008 15:12');
  4. INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Ci.Wai 10/1/2008 4:01');
复制代码
dd/mm/yyyy的日期格式,不能用去, 要如何转换?
only可以mm/dd/yyyy呀?



  1. DECLARE @input varchar(50)
  2. DECLARE @rev VARCHAR(50)
  3. DECLARE @result DATETIME
  4. DECLARE @tempDate VARCHAR(14)
  5. DECLARE @day VARCHAR(2)
  6. DECLARE @month VARCHAR(2)
  7. DECLARE @year VARCHAR(4)
  8. DECLARE @time VARCHAR(5)

  9. SET @input = 'Ce He 10/15/2008 4:13 PM'
  10. SET @rev = REVERSE(@input)

  11. SELECT @tempDate = CAST(REVERSE(SUBSTRING(@rev, 0, charindex(' ',@rev, CHARINDEX('/', @rev,0)))) AS VARCHAR)
  12. SELECT @day = SUBSTRING(@tempDate, 1, 2)
  13. SELECT @month = SUBSTRING(@tempDate, 4, 5)
  14. SELECT @year = SUBSTRING(@tempDate, 7, 11)
  15. SELECT @time = SUBSTRING(@tempDate, 13, 15)
  16. SET @result = SELECT CAST((@day+'/'+@month+'/'+@year+' '+@time) AS DATETIME)
  17. RETURN @result
复制代码


我写到一团糟help me

[ 本帖最后由 musxell 于 13-11-2008 12:57 PM 编辑 ]
回复

使用道具 举报

发表于 13-11-2008 06:34 PM | 显示全部楼层
原帖由 musxell 于 13-11-2008 12:33 PM 发表


好的,没问题
时隔多日,我又有SQL的问题INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Ce.He 15/10/2008 4:13');
INSERT INTO #TEMP([No], [Sign Date]) VALUES('1', 'Wee.Wee 1/1/2008 9:24');
I ...

  1. DECLARE @input varchar(50)
  2. DECLARE @rev VARCHAR(50)
  3. DECLARE @result VARCHAR(50)
  4. DECLARE @tempDate DATETIME

  5. SET @input = 'Ce He 10/15/2008 4:13 PM'
  6. SET @rev = REVERSE(@input)

  7. SELECT @tempDate = CAST(REVERSE(SUBSTRING(@rev, 0, charindex(' ',@rev, CHARINDEX('/', @rev,0)))) AS VARCHAR)
  8. SELECT @result = convert(varchar(20), @tempDate, 103) + ' ' + convert(varchar(20), @tempDate, 8)
复制代码


利用 Cast 和 Convert
还是Oracle 的 SQL 比较容易
回复

使用道具 举报

 楼主| 发表于 14-11-2008 09:18 AM | 显示全部楼层
原帖由 sfkwan 于 13-11-2008 06:34 PM 发表


DECLARE @input varchar(50)
DECLARE @rev VARCHAR(50)
DECLARE @result VARCHAR(50)
DECLARE @tempDate DATETIME

SET @input = 'Ce He 10/15/2008 4:13 PM'
SET @rev = REVERSE(@input)

SELECT @temp ...


给错,wrong information
  1. Ce.He 15/10/2008 4:13
复制代码

现在的input是以上那样,日期的format是dd/mm/yyyy hh:mm
SQL server里面接受 mm/dd/yyyy,我就瓜在这里了
google找不到dd/mm/yyyy hh:mm可以直接convert去date time的
有什么办法么?

我还没用过Oracle
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 21-12-2025 06:50 PM , Processed in 0.164838 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表