0

我厭倦了自己的工作,我無法理解sql datetime字段的工作方式,它真的很難理解,現在已經有2個小時了。Sql服務器日期處理問題

問題:

我有一個訪問數據庫,我將它移動到SQL Server 2008 R2表(進口全部)。

現在我有像SQL表中的日期;

2012-04-03 00:00:00.000 
2012-04-04 00:00:00.000 
2012-04-05 00:00:00.000 
2012-04-04 00:00:00.000 
2012-04-05 00:00:00.000 
2012-04-09 00:00:00.000 
2012-04-09 00:00:00.000 

而且這個SQL如何與日期我什至不能弄清楚wheter其YYYY/MM/DD或yyyy/DD/MM。

,因爲當我運行此查詢:

Select * from Contractor_Appointments where app_date Between '02/04/2012' and '02/04/2012' 

應該從2/APR/2012,而不是我得到返回的所有結果:

2012-02-04 00:00:00.000 
2012-02-04 00:00:00.000 
2012-02-04 00:00:00.000 
2012-02-04 00:00:00.000 

當我插入到數據庫中的新記錄它採取的日期爲:

2012-02-04 00:00:00.000 

然後顯示在上面的查詢:(請幫助我厭倦了這個sql日期處理。 我的電腦日期設定爲02/04/2012。

任何建議:

謝謝

+0

可能重複[什麼正確的方式來格式日期時間在SQL服務器日期時間字段](http://stackoverflow.com/questions/1931530/what-is-the-correct-way-to-format-a-datetime-in-sql-server-datetime場) – dash 2012-04-02 21:34:20

回答

0

你有兩個問題;一個是瞭解SQL Server如何處理日期。在你上面的例子,您的查詢居然是:

SELECT * from Contractor_Appointments where app_date Between '02/04/2012 00:00:00' and '02/04/2012 00:00:00' 

您所要求的所有午夜時分,這並沒有那麼糟糕,除了你的第二個問題之間的約會。您正在使用不明確的日期時間格式。 SQL Server如何解釋此日期取決於各種設置 - 您的語言環境設置以及數據庫使用的語言。在你的情況下,它實際上將它解釋爲2012年2月4日,這表明你正在美國機器上運行查詢,或者你的數據庫語言是日期格式爲MM/dd/yyyy的區域

使用不變量日期時間格式 - 這是明確的,應該獨立於區域設置。不變日期時間格式的一個例子是YYYYMMDD HH:MM:SS

所以,你的查詢變爲:

SELECT * from Contractor_Appointments where app_date Between '20120402 00:00:00' and '20120403 00:00:00' 

,這將給你在2012年4月2日所有的約會(即所有在4月2日午夜和4月3日午夜之間)。

你可以很容易地編寫查詢這樣給你的日期時間似乎都午夜:

SELECT * FROM Contractor_Appointments WHERE app_date = '20120402 00:00:00' 

this answer for more information在SQL Server查詢時如何最好地格式化日期。

編輯

對於您的插入,同樣適用。你需要使用一個毫不含糊的日期時間格式。看到此question for more info,但實際上:

INSERT INTO yourtable (date_column) VALUES ('20120402')會給你你想要的。

如果你有一個DateTime對象,那麼調用DateTime.ToString("yyyyMMdd HH:mm:ss")會給你格式正確的字符串。

+0

相同,也可能在兩個月之間我只是把這個作爲一個例子:) – confusedMind 2012-04-02 21:16:06

+0

你可以請發佈你正在使用的代碼來執行插入?您的問題可能是您正在使用美國機器的日期時間。 – dash 2012-04-02 21:16:55

+0

兩個月之間很簡單 - 您將獲得當前月份的第一個月,以及之後的第一個月。因此,對於所有4月份,BETWEEN條款變成:BETWEEEN'20120401 00:00:00'和'20120501 00:00:00' – dash 2012-04-02 21:18:01

0

嘗試運行dbcc useroptions,看看你的Language設置爲us_english和你dateformat設置爲mdy

+0

事情一旦完成,我必須上傳到我的主機W這是在美國嗎?它只會在我的電腦上生效嗎?或者這個數據庫,並會在我上傳的地方顯示效果?我的意思是說這個命令適用於sql server或數據庫 – confusedMind 2012-04-02 21:09:36

+0

,是的日期設置爲mdy和languge爲us_english – confusedMind 2012-04-02 21:11:19

0

爲什麼格式不一樣?

Select * 
from Contractor_Appointments 
where app_date Between '2012-02-04' and '2012-02-04' 

要找出哪些部分是一個月

select datepart(MONTH,app_date) 
from from Contractor_Appointments 
+0

將取代/ with - help:S? – confusedMind 2012-04-02 21:12:50

+0

什麼是列類型?我猜是日期時間.. – 2012-04-02 21:14:07

+0

我添加了一些內容的答案,找出哪個部分是月 – 2012-04-02 21:15:15

0

要了解日期存儲的格式,請嘗試將其轉換爲更清晰的內容。使用SQL Server CONVERT功能:

SELECT TOP 10 
    CONVERT(VARCHAR(26), app_date, 109), 
    * 
FROM Contractor_Appointments 

這將返回一個更清晰的日期,例如:Apr 28 2006 12:32:29:253PM

中查看轉換格式此引用:中 http://www.sql-server-helper.com/tips/date-formats.aspx

+0

是的,但我有問題放在哪裏條件的日期:) – confusedMind 2012-04-02 21:20:26

+0

我個人一直都有在'yyyy-MM-dd hh:mm:ss'中寫入我的日期作爲sql server的輸入,並且從未遇到過問題。但是,如果您不確定,請將其轉換爲日期時間,然後將其轉換回來,看看您是否獲得了預期的結果。 'SELECT CONVERT(VARCHAR(26),CONVERT(DATETIME,'2012-02-04 00:00:00.000'),109)' – Khan 2012-04-02 21:25:26