簡體   English   中英

SQL WHERE DateTime 介於兩者之間

[英]SQL WHERE DateTime is Between

我在這里有這個查詢:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN CAST('20/12/2015' AS datetime) AND CAST('22/12/2015' AS datetime)

但我一直收到這個錯誤,怎么回事? 我該如何解決?

將 varchar 數據類型轉換為 datetime 數據類型導致值超出范圍。

SQL Server 支持多種格式 - 請參閱有關 CAST 和 CONVERTMSDN 聯機叢書 大多數這些格式取決於您的設置——因此,這些設置有時可能有效——有時則無效。

解決此問題的方法是使用 SQL Server 支持的(稍作調整的) ISO-8601 日期格式- 此格式始終有效- 無論您的 SQL Server 語言和日期格式設置如何。

SQL Server 支持的ISO-8601 格式有兩種:

  • YYYYMMDD僅用於日期(無時間部分); 注意這里:沒有破折號! ,這很重要! YYYY-MM-DD不是獨立的在SQL Server中的日期格式設置,並不會在所有情況下工作!

或者:

  • YYYY-MM-DDTHH:MM:SS用於日期和時間 - 請注意:此格式破折號(但可以省略),以及固定的T作為DATETIME的日期和時間部分之間的分隔符。

這對 SQL Server 2000 和更新版本有效。 在您的具體情況下,請使用此WHERE子句:

WHERE dateCreated BETWEEN '20151220' AND '20151222'

並且您甚至不需要任何顯式CAST操作(或者如果您想使用顯式CAST - 那么我建議您轉換為DATE數據類型 - 而不是DATETIME )。

如果您使用 SQL Server 2008 或更新版本和DATE數據類型(僅DATE -而不是DATETIME !),那么您確實也可以使用YYYY-MM-DD格式,這也適用於 SQL Server 中的任何設置。

不要問我為什么整個主題如此棘手且有些令人困惑 - 這就是它的方式。 但是對於YYYYMMDD格式,您應該適用於任何版本的 SQL Server 以及 SQL Server 中的任何語言和日期格式設置。

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

作為在 SQL Server 中比較日期時的一般規則,不要使用特定於區域設置的格式,請使用通用ISO 8601格式'yyyy/MM/dd'以便查詢變為:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN CAST('2015/12/20' AS datetime) AND CAST('2015/12/22' AS datetime)

您也可以使用特定於區域設置的一種,但您必須確保服務器上的日期格式在您的代碼將連接到的所有服務器上始終保持相同。

使用CONVERT你可以寫這樣的東西:

SELECT * 
FROM QuestionnaireAnswer 
WHERE
dateCreated BETWEEN CONVERT(datetime, '20/12/2015', 103)
AND CONVERT(datetime, '22/12/2015', 103);

檢查服務器上的區域設置。 我敢打賭,您已設置為美國日期格式,但您擁有的日期不是美國格式。

有關在此處查詢語言環境設置的更多信息

這個 SO 問題有多種方法可以調整 SQL 的區域設置,包括按用戶。

如果您無權更改整個服務器的區域設置,您可以在此處的會話中更改您的區域設置。 請注意, SET LANGUAGE 會自動設置 DATEFORMAT ,但您可以自行設置 DATEFORMAT

要對此進行測試,請嘗試反轉日期中的日期和月份。 像這樣:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN CAST('12/20/2015' AS datetime) AND CAST('12/22/2015' AS datetime)

或者嘗試將日期置於“區域設置不敏感格式”中,例如 yyyymmdd HH:mm:ss.fff 。

如果列是日期字段,那么您應該這樣做:

SELECT * 
FROM QuestionnaireAnswer 
WHERE dateCreated BETWEEN TO_DATE('20-DEC-2015') AND TO_DATE('22-DEC-2015')

根據架構和配置,可能不是 100% 准確。

暫無
暫無

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

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