2012-12-12 36 views
3

我有硬編碼日期的查詢,在這種格式SQL Server日期格式依賴用戶嗎?

startdate >= '2012-11-03' AND enddate <= '2012-11-30 23:59' 

我的數據庫日期格式爲「MDY」,但是我確定它將接受YYYY-MM-DD作爲其通用日期結構。

,當我試圖在我的目標DB與特定的數據庫用戶(用戶X)我得到一個錯誤有關的日期格式

消息242連接,級別16,狀態3,線運行在SSMS此查詢1
將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。

然而,當我運行連接爲SA用戶的確切查詢,查詢執行..

這是爲什麼?我給了userX完整的dbo權限(系統管理員等),仍然得到錯誤?

+0

不知道什麼不工作的原因一個用戶。但是,* ISO日期格式*是'yyyymmdd'和* ISO8601格式*是'yyyy-mm-ddThh:mi:ss.mmm'。嘗試使用它們,看看你是否仍然有錯誤。 – Kaf

回答

2

如果您需要使用字符串指定日期時間,則應使用與語言無關的格式安全

在SQL Server中,這就是ISO-8601格式(稍作改動),它支持兩種基本的安全格式DATETIME總是工作 - 不管你的語言,地區和日期格式設置:

YYYYMMDD    (e.g. 20121231 for 31st of December 2012) if you need date only 

YYYY-MM-DDTHH:mm:ss (e.g. 2012-12-31T21:05:00 for 31st of December 2012, 9:05pm) 

注:

  • 第一日期只有格式有沒有破折號或分隔符!

  • 第二格式具有短劃線的日期(可以省略,太),並有一個固定T作爲日期和字符串

更新的時間部分之間的分隔符:如按您最後的評論(關於這兩個用戶的不同的默認語言) - 試試這個:

-- this is how your `SA` interprets the string as datetime.... 
SET LANGUAGE english 
SELECT CAST('2012-11-30 23:59' AS DATETIME) 

作品就好了......

-- this is how your British user interprets teh string as datetime 
SET LANGUAGE british 
SELECT CAST('2012-11-30 23:59' AS DATETIME) 

消息242,級別16,狀態3,行7
varchar數據類型爲datetime數據類型的轉換導致外的範圍內的值。

此試圖解釋字符串作爲11日2012和明顯的30個月的,失敗....

+0

嗨馬克,我很欣賞你的答案,因爲它的工作,但我很困惑,我的第一個日期字符串不適用於一個用戶,但他們的SA用戶工作? – davey

+0

@davey:做'SA',另一個用戶有相同的語言設置嗎? –

+0

我在哪裏可以檢查? – davey

0

考慮使用

開始日期> = '2012年11月3日' 日期和結束日期< '2012年12月1日'

代替