簡體   English   中英

將字符串轉換為日期並比較日期

[英]Convert String to Date and compare dates

我有一個數據庫,其中日期列保存為類型nvarchar,日期格式為dd/mm/yyyy (英國)。 我正在嘗試執行選擇查詢以搜索在兩個日期之間發布的數據。

查詢是:

SELECT * FROM table 
  WHERE CONVERT(datetime,postdate,103) BETWEEN ? AND ?

我已將我的字段轉換為日期時間,但每當我嘗試運行查詢時,我都會收到錯誤消息

java.lang.Exception:com.microsoft.sqlserver.jdbc.SQLServerException:
將nvarchar數據類型轉換為日期時間數據類型會導致超出范圍的值

當我運行isDate查詢時:

SELECT * FROM table WHERE ISDATE(postdate)=0

顯示日期為18/02/2013行。 如果我沒有錯,這意味着18被視為一個月。

我怎樣才能基本上將我的字段轉換為有效日期並比較日期?

第一個問題是您將日期存儲在字符串列中。 你為什么不使用DATEDATETIME 如果您這樣做是為了保留您的d / m / y格式,請停止這樣做。 格式是表示層的責任,不應影響存儲。 另外,你為什么要使用NVARCHAR 您期望在需要Unicode的日期文字中使用哪種符號?

接下來是您沒有正確的驗證,並且錯誤的數據已經在您的列中結束。 您可以按如下方式識別此錯誤數據:

SET DATEFORMAT DMY;

SELECT * FROM dbo.table
  WHERE ISDATE(postdate) = 0;

現在,通過在知道數據時更新數據或將這些行設置為NULL來修復該數據,直到查詢返回0行。

請注意,您可能擁有類似於2013年11月13日的數據,這顯然不在D / M / Y fomrat中,如果是這種情況,您也可以擁有看似有效的數據但是輸入06/09的用戶/ 2013年6月9日或9月6日? 你怎么能確定?

防止此問題明天再次發生的最安全方法可能是添加新列,移動數據,刪除舊列,並停止在所有層使用字符串。

ALTER TABLE dbo.table
  ADD d DATE;

UPDATE dbo.table 
  SET d = CONVERT(DATETIME, postdate, 103);

ALTER TABLE dbo.table
  DROP COLUMN postdate;

EXEC sp_rename N'dbo.table.d', N'postdate', N'COLUMN';

您可以在不進行所有這些交換的情況下內聯執行此操作,如下所示:

SET DATEFORMAT DMY; -- the key you missed in your attempt I think
ALTER TABLE dbo.table ALTER COLUMN postdate DATE;

如果您無法修復列本身,那么至少考慮在此列周圍添加一個檢查約束和一些驗證,以便錯誤的數據不會在明天返回。 例如:

ALTER TABLE dbo.table
  ADD CONSTRAINT prevent_bad_dates
  CHECK (CONVERT(DATE, postdate, 103) >= '19000101');

在插入之前進行驗證,假設您將varchar參數放入執行插入的存儲過程中:

ALTER PROCEDURE dbo.whatever
  @postdate NVARCHAR(10), -- assuming here
  @other_params...
AS
BEGIN
  SET NOCOUNT ON;
  SET DATEFORMAT DMY;

  IF ISDATE(@postdate) = 0
  BEGIN
    RAISERROR('Incorrect format for date: %s.', 11, 1, @postdate);
    RETURN;
  END

  ... perform insert...
END

仍然無法幫助您理解輸入06/09/2013的用戶是指6月9日還是9月6日。 因此,我強烈建議您從用戶手中取出寫意的臨時條目,並強制他們使用日歷控件或日期選擇器等,這樣就可以完全控制格式。 如果需要將字符串文字發送到SQL Server,最安全的格式將是YYYYMMDD 此外,您應該了解使用BETWEEN而不是開放式范圍的潛在問題。 請閱讀以下帖子:

當您從數據庫中檢索日期時,您將獲得java.sql.date格式的日期!

你現在需要將它轉換為java.util.date!

可以使用以下代碼完成

java.util.Date utilDate = new java.util.Date(SQLDate.getTime());

嘗試它,它會完成!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM