2010-10-06 173 views
1

我在我的数据库中有这个字段year_start_1它是一个整数字段,输出示例是20100827我试图创建一个子字符串来创建年份,星期,天和更改格式是27/08/2010ASP.NET查询子字符串

这里就是我想要

Dim query as String = "Select * from openquery (devbook, 'SELECT cast(year_start_1 as varchar(8)) as year_start_1, DATENAME(DAY, substring(CAST(year_start_1 AS VARCHAR(8)),6,2) + DATENAME(MONTH, substring(CAST(year_start_1 AS VARCHAR(8)),4,2) + DATENAME(YEAR, substring(CAST(year_start_1 AS VARCHAR(8)),1,4))) FROM web_statements')" 

它只是扔了一个错误,我不知道为什么:

服务器无法处理reques t

我试过使用转换,但它不起作用。

任何想法?

UPDATE

与克里斯的建议

Dim query as String = "Select * from openquery (devbook, 'SELECT year_start_1, cast(year_start_1 as varchar(8)) as year_start_1, substring(CAST(year_start_1 AS VARCHAR(8)),7,2)+''/''+substring(CAST(year_start_1 AS VARCHAR(8)),5,2)+''/''+substring(CAST(year_start_1 AS VARCHAR(8)),1,4) FROM web_statements')" 

仍然得到错误

感谢

UPDATE

可能似乎无法得到它内部的工作曲ERY所以不得不在ASP.Net代码周围做一个工作

'POINTS END DATE YEAR 
Dim strPointsDateEndYear = Mid(drv.Row("year_end_1"), 3, 2) 
Dim strPointsDateEndMonth = Mid(drv.Row("year_end_1"), 5,2) 
Dim strPointsDateEndDay = Right(drv.Row("year_end_1"), 2) 

Dim strPointsDateEnd As String = strPointsDateEndDay + "/" + strPointsDateEndMonth + "/" + strPointsDateEndYear 

感谢您的帮助,虽然

+0

@InSane刚刚在T-SQL中得到一个'服务器无法处理请求'的错误 – 2010-10-06 10:41:53

+0

,+确实作为串联工作。 – Nellius 2010-10-06 10:54:20

+0

@InSane:T-SQL中的字符串连接操作符是'+','&'是一个数字操作符。 – Guffa 2010-10-06 10:55:03

回答

2

你的第一个DATENAME似乎并没有关闭其所有括号中的下一个DATENAME开始之前:

DATENAME(DAY, substring(CAST(year_start_1 AS VARCHAR(8)),6,2) + DATENAME[...] 

我应该假定是:

DATENAME(DAY, substring(CAST(year_start_1 AS VARCHAR(8)),6,2)) + DATENAME[...] 

编辑:虽然修复了这个小错误(并将其转换为调试版),但我收到了有关将字符串转换为日期的错误。我不知道是什么东西DATENAME是为了做,但这个怎么样:

DECLARE @year_start_1 int 
SET @year_start_1 = 20100827 

SELECT cast(@year_start_1 as varchar(8)) as year_start_1, 
substring(CAST(@year_start_1 AS VARCHAR(8)),7,2)+'/'+substring(CAST(@year_start_1 AS VARCHAR(8)),5,2)+'/'+substring(CAST(@year_start_1 AS VARCHAR(8)),1,4) 

(转换为非表中选择基于测试/调试)

所以,你会想什么你SQL的最后一行将是(未经测试):

Select * from openquery (devbook, 'SELECT cast(year_start_1 as varchar(8)) as year_start_1, substring(CAST(year_start_1 AS VARCHAR(8)),7,2)+'/'+substring(CAST(year_start_1 AS VARCHAR(8)),5,2)+'/'+substring(CAST(year_start_1 AS VARCHAR(8)),1,4) FROM web_statements') 

调试笔记二编辑:

我想这可能也是WOR建议如何调试这类问题。该错误消息表明,您发送子语句的链接服务器无法处理请求。在这种情况下尝试的第一件事是直接在服务器上运行请求以查看会发生什么。在这种情况下,事实上只是自己解析它会揭示我得到的第一个错误。

一旦你有你的语句运行表单管理工作室或直接在服务器上的任何东西,你可以尝试将其转换回“openquery”风格的声明,看看是否仍然工作。 Bascially将你复杂的场景分解成许多较小的比特来单独测试每一个。

+0

似乎无法得到这个工作看到我的更新与您的位在我的查询 – 2010-10-06 11:51:26

+0

你不需要复制上面做的一切。声明和设置,实际上te @ year_start_1变量只是因为我没有合适的数据表,所以我想创建一个测试值为的变量。 – Chris 2010-10-06 11:54:16

+0

我看到我已经再次更新了我的问题,但仍然给出错误我做错了什么? – 2010-10-06 11:59:24

0

您对字符串使用datename函数,但应该在datetime值上使用该函数。它们嵌套在一起,所以你最终只需要一整天,而且它甚至不会做你正在寻找的东西。

要得到你要求,你可以使用字符串操作它在它的组件之间分割,并添加斜线格式:

substring(CAST(year_start_1 AS VARCHAR(8)),7,2) + '/' + 
substring(CAST(year_start_1 AS VARCHAR(8)),5,2) + '/' + 
substring(CAST(year_start_1 AS VARCHAR(8)),1,4) 
+0

值得注意的是,这些指标在前两部分也是错误的 - 它们应该从7和5开始,而不是6和4开始。 – Chris 2010-10-06 10:56:01

+0

是的,我注意到和Chris一样,这些指数似乎是 – 2010-10-06 11:09:23

+0

@Chris,Dick:是的,没错。 – Guffa 2010-10-06 12:35:22

0
 
select convert(varchar(10),convert(smalldatetime,'20100827'),103) will return 08/27/2010

所以,你的解决方案是:

 
select convert(varchar(10),convert(smalldatetime,convert(varchar,year_start_1)),103) will return 27/08/2010
+0

convert似乎并不能确定为什么 – 2010-10-06 11:04:05