在where子句中比较英国格式日期时出错

时间:2009-11-01 20:46:46

标签: sql sql-server sql-server-2005 tsql

当我在sql server2005中运行时,我收到了错误。

select * from productratedates 
where RateDate BETWEEN '31/10/2009' AND '03/11/2009'

错误:将char数据类型转换为日期时间数据类型会导致日期时间值超出范围。

但是当我在SQl服务器2005中运行它时。它完全可以。

select * from productratedates 
where RateDate BETWEEN '2009-10-31' AND '2009-11-03'

我想用英国格式比较日期。

任何帮助!!

4 个答案:

答案 0 :(得分:2)

您可以在将日期发送到服务器之前将其转换为YYYY-MM-DD格式。

答案 1 :(得分:2)

您的评论说您想以日/月/年格式输入日期。您可以使用SET DATEFORMAT选择该格式:

SET DATEFORMAT dmy;

例如:

set dateformat dmy
select cast('31/10/2009' as datetime) -- succeeds
set dateformat mdy
select cast('31/10/2009' as datetime) -- fails

您可以使用DBCC检索当前日期格式设置:

dbcc useroptions

list of available languages及其日期格式可从以下网址获取:

exec sp_helplanguage

对我来说,名为“British”的语言有dateformat dmy。因此,您可以更改登录到英国的默认语言(从登录的属性页面。)您甚至可以在connection string中指定它:

Server=<server>;Uid=<login>;Pwd=<password>;Current Language=British

答案 2 :(得分:0)

日期尽可能以美国格式阅读,因此'31 / 10/2009'必须是英国格式,但'03 / 11/2009'翻转至3月11日。通过及时倒退来搞砸你的BETWEEN。

我不知道它是否适合你,但我们总是使用格式dd-mmm-yyyy:

select * from productratedates where RateDate BETWEEN '31-oct-2009' AND '03-nov-2009'

答案 3 :(得分:0)

如何格式化日期实际上是一个接口事物。如果您纯粹关注数据日期,则应始终采用一种特定格式YYYY/MM/DD

您的界面负责以本地化格式显示日期。通过使用这种做法,脚本对于它的使用位置和使用的语言是模棱两可的。因此,应始终以标准格式比较日期。

我建议你做的是让你的界面以你喜欢的格式显示它,并将后端(包括SQL语句)显示为标准化的日期格式。

相关问题