2010-10-06 211 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