2014-08-28 92 views
0

我有一臺已安裝在德國服務器上的SQL Server 2012 Express數據庫。我創建了一個數據庫,現在已經意識到日期格式不正確。我需要顯示每個日期爲dd/mm/yyyy。更改SQL Server 2012中的日期格式

當我運行DBCC USEROPTIONS(做一些改變到服務器之後),我得到以下 -

language  dateformat 
------------------------- 
British  dmy 

當我運行在一個新的查詢select GetDate(),它顯示如下的日期 -

2014-08-28 13:53:10.550 

底線的問題是,當我到一個文本框上的Web表單項目進入28/08/2014,它錯誤

字符串未被識別爲有效的日期時間。

selP.StartDate = Convert.ToDateTime(tbStartDate.Text); 

任何想法,爲什麼發生這種情況?自從將設置更改爲英國和dmy後,我創建了一個新用戶,但仍然會產生相同的錯誤。

+0

這是一個.net問題。我已經添加了相應的標籤。 – 2014-08-28 12:03:31

回答

0

在SQL中,您需要在插入或更新數據庫之前將該字符串轉換爲DATETIME。

CAST('28/08/2014' AS DATETIME) 

您可以使用CONVERT更改顯示日期的格式。例如,以下將顯示英國短格式(DD/MM/YYYY)

SELECT CONVERT(varchar(50), GetDate(), 103) 

如果在C#這樣的日期,你需要檢測當地的文化和投字符串的日期時間爲approporate。

//You can set the culture on the current thread: 
Thread.CurrentThread.CurrentCulture = CultureInfo.InstalledUICulture; // or new CultureInfo("en-GB"); //dd/MM/yyyy 

//or you can pass it to the DateTime.Parse method. Something like this: 
DateTime startDate = DateTime.Parse(tbStartDate.Text, CultureInfo.InstalledUICulture); 

DateTime startDate = DateTime.ParseExact(tbStartDate.Text,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat) 
+0

沒有存儲過程插入此日期,因此不能進行強制轉換。我已經用C#行更新了這個問題。在英國的服務器上輸入28/08/2014時,該應用程序工作正常。 – dynamicuser 2014-08-28 12:00:20

+0

問題不在於顯示日期,而在於插入日期。 – dynamicuser 2014-08-28 12:07:32

0
selP.StartDate=tbStartDate.Text.ToString("dd/MM/yyyy") 
0

其實GETDATE()函數返回系統日期和時間格式 'YYYY-MM-DD HH:MI:ss.mmm' 不論Dateformat .Date格式的SQL Server在美國最新格式MM/DD/YY,除非安裝了本地化版本的SQL Server,這似乎是這裏的情況。 使用

SET DATEFORMAT <format> 

其設置日期部分(月/日/年),用於輸入datetime或smalldatetime數據的順序。有效參數包括mdy,dmy,ymd,ydm,myd和dym。美國英文默認爲mdy。

此方法允許您使用發送到d/m/y的SQL Server的日期的日期格式,但它是依賴於連接的。如果與SQL Server建立了新連接,或者服務器已停止並重新啓動,則日期格式將返回到默認情況下的dmy。

2

SQL Server不會以任何字符串格式存儲DateTime - 它存儲爲8字節的數值。

的各種設置(語言,日期格式)僅影響DateTime如何在SQL Server Management Studio中顯示你 - 或如何當您嘗試將字符串轉換爲DateTime它被解析。

SQL Server支持多種格式 - 請參閱MSDN Books Online on CAST and CONVERT。大多數這些格式都取決於您擁有的設置 - 因此,這些設置可能會工作一些 - 有時不會。

解決這個問題的方法是使用(稍作改動)ISO-8601日期由SQL Server支持的格式 - 這種格式的作品總是 - 不管你的SQL Server的語言和日期格式設置。

ISO-8601 format由SQL Server支持有兩種形式:

  • YYYYMMDD只是日期(沒有時間部分);請注意:沒有破折號!,這非常重要! YYYY-MM-DD不是獨立於您的SQL Server中的dateformat設置,並將在所有情況下工作!

或:

  • YYYY-MM-DDTHH:MM:SS的日期和時間 - 這裏需要注意:這種格式破折號(但他們可以可省略),並固定T的日期和時間之間的分隔符你的部分DATETIME

這對SQL Server 2000及更新版本有效。

如果你使用SQL Server 2008或更高版本和DATE數據類型(僅DATE - !DATETIME),那麼你的確可以同時使用YYYY-MM-DD格式,將工作,也與任何設置在你的SQL Server 。

不要問我爲什麼這整個話題如此棘手,有點令人困惑 - 這就是它的方式。但使用YYYYMMDD格式,對於任何版本的SQL Server以及SQL Server中的任何語言和dateformat設置,都應該可以。

如果您只需要日期部分,則SQL Server 2008及更新版本的建議是使用DATE;如果需要日期和時間,則建議使用DATETIME2(n)。如果可能,您應該嘗試開始逐步淘汰DATETIME數據類型

-2
SELECT CONVERT(varchar(50), GetDate(), 103) 
SELECT CONVERT(varchar(50), JoiningDate, 103)from Employee where EmpId='1001' 
+0

你能給一些解釋嗎?就目前而言,這與問題的關係並不十分清楚。 – 2016-11-12 14:39:46