SQL - 将varchar数据类型转换为日期时间数据类型会导致超出范围的值

use*_*495 76 t-sql sql-server datetime

运行SQL到我的数据类型值从转换的时候,我一直得到以下错误varchardatetime.

消息242,级别16,状态3,行1将varchar数据类型转换为日期时间数据类型导致超出范围的值.

我已经检查了数据并且看不到任何奇怪的东西:执行以下检查并且所有返回都没有结果

SELECT [Date] from table where [DATe] is null
SELECT [Date] from table where [DATe] = ''
SELECT [Date] from table where LEN([date])> 10
SELECT [Date] from table where LEN([date])< 10
SELECT top 100 [Date] , SUBSTRING([date],4,2) from [table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 12
SELECT top 100 [Date] , SUBSTRING([date],1,2) from table where convert(int, SUBSTRING([date],4,2)) < 1 or convert(int, SUBSTRING([date],4,2)) > 31
Run Code Online (Sandbox Code Playgroud)

还有什么值得关注的东西,可能值得指点或帮助解决这个问题吗?似乎无法深究它.

Mah*_*ahe 68

我一周前遇到了同样的问题.问题在于时区设置.以mm/dd/yyyy等其他格式指定(通常有效).

将日期指定为2013年12月30日导致我的错误.但是,将其指定为mm/dd/yyyy格式.

如果您需要转换输入,可以尝试查看CONVERT方法.语法是

CONVERT(VARCHAR,@your_date_Value,103)

CONVERT(VARCHAR, '12/30/2013', 103)

完成103是日期时间格式.

请参阅此链接以获取转换格式和进一步阅读. http://www.w3schools.com/sql/func_convert.asp

  • 感谢伙伴的帮助。我尝试对此进行转换,但仍然没有任何运气。是否是因为 table 仍然是 varchar 或者其他任何可能导致此失败的原因? (2认同)
  • 如果您发布示例数据(在表中),这将非常有帮助。在评论中,您说您想要yyyy-mm-dd格式。因此,请尝试使用此“ SELECT CONVERT(char(10),GetDate(),126)”。只需将** GETDATE()**替换为必要的值即可。 (2认同)

Mr.*_*. C 55

由于一个愚蠢的错误,我遇到了这个问题.确保日期确实存在!

例如:

2015年9月31日不存在.

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150931'
Run Code Online (Sandbox Code Playgroud)

所以这失败的消息:

Error converting data type varchar to datetime.
Run Code Online (Sandbox Code Playgroud)

要修复它,请输入有效日期:

EXEC dbo.SearchByDateRange @Start = '20150901' , @End = '20150930'
Run Code Online (Sandbox Code Playgroud)

它执行得很好.

  • 刚刚使用了强制转换(SUBSTRING([MyDateField],1,2)作为整数)> 31,并在12月60日找到了记录.谁输入这些东西,苏斯博士? (4认同)
  • 谢谢!这是我的问题.我的套装中有一些不好的数据 - 01/01/1113,哈哈. (3认同)
  • 是的,我刚刚在我必须使用的数据库中找到了2015年2月29日的到期日.我想知道它是如何进入那里的.我想知道还有多少人...... (2认同)
  • 对我来说,在格式化日期以构建SQL语句时,我输入了错误的格式字符串.我曾经使用`Format(DateTime.Now,"yyyymmdd")``它应该是`Format(DateTime.Now,"yyyyMMdd")` (2认同)

小智 21

我最近有类似的问题.在应用程序和数据库服务器中正确设置了区域设置.但是,执行SQL导致了

"将varchar数据类型转换为日期时间数据类型会导致超出范围的值".

问题是db用户的默认语言.

要在SSMS中检查或更改它,请转到安全性 - >登录,然后右键单击运行查询的用户的用户名.选择属性 - >常规,并确保对话框底部的默认语言符合您的预期.

对运行查询的所有用户重复此操作.

  • 这对我有帮助。只是一个小的更正:`server login` 的默认语言不是`db user`。https://www.top-password.com/blog/difference-between-sql-server-logins-and-database-users/ (2认同)
  • 由于它是在程序代码中设置的,并且我无权访问该代码,因此我将其从“英语”更改为“英式英语”,并且成功了! (2认同)

Sac*_*hra 9

你可以利用

Set dateformat <date-format> ;
Run Code Online (Sandbox Code Playgroud)

在你sp函数或存储过程中完成任务.

  • 这解决了我的问题。我不明白的是为什么这突然开始发生:( (2认同)

小智 5

Create procedure [dbo].[a]

@examdate varchar(10) ,
@examdate1 varchar(10)
AS
Select tbl.sno,mark,subject1,
Convert(varchar(10),examdate,103) from tbl
where 
(Convert(datetime,examdate,103)  >= Convert(datetime,@examdate,103) 
and (Convert(datetime,examdate,103) <=  Convert(datetime,@examdate1,103)))
Run Code Online (Sandbox Code Playgroud)

  • 请在您的答案中添加更多描述。这将有助于提问者从你的答案中获得更多信息。 (5认同)

小智 5

在顶部添加:

SET DATEFORMAT ymd; 
Run Code Online (Sandbox Code Playgroud)

或您在查询中使用的任何格式