2013-10-09 32 views
0

,我有以下數據:日期時間解釋問題

StartDate FinishDate Details 
09/10/2013 11/10/2013 xxx 
14/10/2013 13/10/2014 Taking a year off 

雖然編輯這個數據我該檢查的日期範圍不重疊。

我正在通過ado來訪問SQL查詢來執行此操作;我將輸入日期輸入數據庫格式(即'mm/dd/yyyy');這是我得到的查詢:

SELECT Count(*) 
FROM MarkerAbsence 
WHERE PerID = 718 AND 
    ('10/09/2013' BETWEEN StartDate AND FinishDate OR 
    '10/11/2013' BETWEEN StartDate AND FinishDate) 

如果數據是有效的,它應該返回零記錄;但它不返回1(是上面列出的第二個記錄),因此似乎將「10/11/2013」​​解釋爲dd/mm/yyyy而不是mm/dd/yyyy。

然而,如果我這樣做是SMO:

DECLARE @datevar datetime2 = '31/12/2008'; 
SELECT @datevar; 

我得到:

Msg 241, Level 16, State 1, Line 1 
Conversion failed when converting date and/or time from character string. 

雖然

DECLARE @datevar datetime2 = '12/31/2008'; 
SELECT @datevar; 

回報

2008-12-31 00:00:00.0000000 

那麼,爲什麼我有這個問題,我該如何解決它?

+0

什麼是StartDate和FinishDate字段的數據類型?您正在使用哪種RDBMS?它是SQL Server嗎? –

+0

您確定它與第二條記錄匹配,而不是第一條記錄?我認爲2013年9月10日會在10/09/2013和10/11/2013之間。 –

回答

1

如果您使用MS Access運行查詢,則需要使用#符號來劃分日期,即:#12/31/2008#。如果因爲任何原因無法使用,最好使用'yyyy-mm-dd'格式的字符串日期,因爲它會被識別並且是明確的。

由於MS是一家美國公司,而美國使用mm/dd/yyyy格式,所以您可能會遇到此問題,因此MS已經拖延了大部分較早的軟件,以便儘可能將日期視爲此格式,而你可能在一個國家使用 - 並且你的電腦的地區設置爲使用 - dd/mm/yyy格式。由於並非所有的MS軟件都遵循這個規則,所以你有這個問題。

的解決方案是使用一個字符串日期格式是明確的,如:yyyy-mm-ddmmm/dd/yyyy,或dd/mmm/yyyy(其中MMM返回一個三字母月如Dec)。

+0

謝謝你的回答; #s不工作,如果後端是SQL服務器,只有它是訪問,但我會玩日期格式,看看會發生什麼。 –

+0

MS作爲美國公司與它無關 - 訪問(至少從2003年起)將使用PC的區域設置。 SQL Server應根據您在安裝時選擇的語言使用適當的格式。 –

+0

'yyyy-mm-dd'確實解決了這個問題 - 非常感謝 –

1

對日期字符串使用dd/mm/yyyy格式。默認情況下,如果沒有進行明確的轉換,SQL預期日期字符串爲mm/dd/yyyy或yyyy-mm-dd格式。因此,要麼改變你的字符串以匹配其中一種格式,要麼執行此操作:

SELECT Count(*) 
FROM MarkerAbsence 
WHERE PerID = 718 AND 
    (CONVERT(DATETIME, '10/09/2013', 103) BETWEEN StartDate AND FinishDate OR 
    CONVERT(DATETIME, '10/11/2013', 103) BETWEEN StartDate AND FinishDate)