2015-11-07 113 views
-1

根據我以前的問題VB.net SQL statement to query 1 yr old Timestamp,我的SQl查詢回顧一年的記錄將停止一半,並出現以下錯誤:Select Error: ORA-01830: date format picture ends before converting entire input stringVB.net從DateTime.Now.ToString減去1年

因此,我決定對從當前日期起不超過一年的行執行不同的路由。

要做到這一點,我會在VB.net下面的SELECT語句:

Dim strSearch As String = "Select timestampVal from table_name WHERE timestampVal > " & minusYear & " order by timestampVal DESC" 

對於我minusYear變量在我的SELECT語句中,我將首先拉動下面的當前日期字符串:

Dim sign As String = DateTime.Now.ToString("yyyyMMdd-hhmmss") 

但是,要得到minusYear我需要以某種方式減去從sign一年。我想試試Dim minusYear As String = DateTime.Now.AddYears(-1);但它的格式如此MM\DD\YYYY HH:MI:SS PM這將不起作用,因爲我需要查詢字符串看起來像yyyyMMdd-hhmmss

有沒有辦法簡單地從我的符號字符串減去1年?我嘗試,但當然有數據類型的問題,並將字符串轉換爲CInt並不真正的工作。

如果我能得到1年的減號獲得minusYear,那麼我的select語句的作品[我已經在SQL測試它,以便通過這種方式將工作,我只需要獲得sign's值減去同期】

回答

1

這是一種代碼嗅覺,在應用層而不是SQL上進行操作。如果可以的話,我會在第一個問題上堅持一點(我會在下面看一看)。但與此同時,要做到這一點在VB.NET ...

Dim sign As String = DateAdd(DateInterval.Year, -1, Now()).ToString("yyyyMMdd-hhmmss") 
+0

我在看到您對字符串格式的評論後更新了內容。這現在就像你想要的那樣格式化它。但是,這又是一種代碼味道。你不應該建立SQL查詢字符串。如果您創建一個參數化查詢並將參數作爲日期時間而不是字符串傳入,那麼您不必擔心日期的格式。 –

+0

這是我想要的。謝謝。問題是數據庫是在我處理應用程序之前預先創建的。該應用程序在日期列中有超過1000個信息,因此;我必須處理已實施的信息。他們都看起來像他們遵循相同的格式;然而,當我嘗試在這裏執行此操作時,數據庫標誌會阻止我使用上面提到的錯誤。據說,我知道在VB.net中應用查詢並沒有標記錯誤。所以即使我更喜歡在數據庫中執行查詢,我也無法繞過錯誤。再一次感謝你! – narue1992

2

有幾件事情:

  • 在.NET中,格式字符串是區分大小寫的。您已指定hh,這是12小時制的小時數。你可能意味着HH在24小時的時間內連續工作數小時。

  • 使用DateTime.Now.AddYear(-1)減去一年要容易得多,但請記住DateTime.Now位於服務器的本地時區。在很多情況下,這本身就是一個問題。根據您的數據,您可能會考慮使用DateTime.UtcNow或可能使用TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz)轉換爲特定時區,而不是依賴服務器的時區設置。

  • 真的,你不應該在數據庫中存儲日期或時間varchar。在oracle中使用TIMESTAMP字段。所有的格式化問題都源於此。創建一個新列,遷移數據,更新您的使用情況並刪除舊列。

  • 您也不應該通過字符串連接傳遞參數。這通常對性能不利(防止緩存執行計劃),並且有時可能是make your code vulnerable to SQL Injection attacks

  • 當你使用pass parameters properly on the .NET side,而不是將它們嵌入字符串中時,字符串表示格式變得不相關。

  • 除非您的應用程序層中有特定的東西需要考慮,否則真的不應該這樣做。相反,使用數據庫中的函數來計算當前時間並在那裏減去一年。將當前時間作爲參數發送到數據庫毫無意義,因爲您的數據庫本身可以做到這一點。