将varchar数据类型转换为datetime数据类型会导致SQL查询中出现超出范围的值

时间:2015-02-02 05:05:41

标签: sql sql-server sql-server-2008 datetime

我有一个包含存储日期和时间的列的表。我需要编写一个查询来只获取该列的日期,

SELECT CAST(CONVERT(VARCHAR, LoginTime, 101) AS datetime) FROM AuditTrail 

但是,当我运行查询时,我收到此错误:

  

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

列中的数据是datetime ex:2012-06-18 12:08:04.000 所以我只需要提取日期并删除时间 请注意[Logintime]列是数据时间格式

你能帮我吗?

5 个答案:

答案 0 :(得分:7)

在SQL Server中尝试ISDATE()函数。如果为1,请选择有效日期。如果0选择无效日期。

SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail 
WHERE ISDATE(LoginTime) = 1

编辑:

根据您的更新我需要仅提取日期并删除时间,然后您只需使用内部CONVERT

SELECT CONVERT(VARCHAR, LoginTime, 101) FROM AuditTrail 

SELECT LEFT(LoginTime,10) FROM AuditTrail

编辑2:

错误的主要原因将在WHERE子句中的日期,

SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail
where CAST(CONVERT(VARCHAR, LoginTime, 101) AS DATE) <= 
CAST('06/18/2012' AS DATE)

将与

不同
SELECT cast(CONVERT(varchar, LoginTime, 101) as datetime)  
FROM AuditTrail
where CAST(CONVERT(VARCHAR, LoginTime, 101) AS DATE) <= 
CAST('18/06/2012' AS DATE)

<强>结论

编辑2 中,第一个查询尝试以mm/dd/yyyy格式过滤,而第二个查询尝试以dd/mm/yyyy格式过滤。它们中的任何一个都会失败并抛出错误

  

导致将varchar数据类型转换为日期时间数据类型   在超出范围的价值。

因此,请确保使用mm/dd/yyyydd/mm/yyyy格式过滤日期,无论哪种格式都适用于您的数据库。

答案 1 :(得分:1)

希望这可以帮到你:

SELECT  CAST(LoginTime AS DATE)
         FROM    AuditTrail 

如果你想在这个日期时间或它的不同部分有一些过滤器,你可以使用内置函数,如年和月

答案 2 :(得分:0)

正如您在此问题的答案中看到的那样: Conversion of a varchar data type to a datetime data type resulted in an out-of-range value

-- set the dateformat for the current session
set dateformat dmy

-- The conversion of a varchar data type 
-- to a datetime data type resulted in an out-of-range value.
select cast('2017-08-13 16:31:31'  as datetime)

-- get the current session date_format
select date_format
from sys.dm_exec_sessions
where session_id = @@spid

-- set the dateformat for the current session
set dateformat ymd

-- this should work
select cast('2017-08-13 16:31:31'  as datetime)

答案 3 :(得分:0)

我也遇到了同样的问题。我已经在 SQL Server 中以 'YYYY-MM-DD HH:NN:SS' 格式存储了大约 20 年的日期,但今天从使用 OleDbCommand 和 UPDATE 查询的 C# 解决方案中无法再使用。

我的问题的解决方案是删除格式中的连字符,因此生成的格式现在是“YYYYMMDD HH:MM:SS”。我不知道为什么我以前的格式不再有效,但我怀疑这与 ADO 的某些 Windows 更新有关。

答案 4 :(得分:-1)

  

有些问题,但是我找到了解决方法,这是:


  

2月2日,2月28日(leap年29)

这是我的代码

 public string GetCountArchiveByMonth(int iii)
        {
// iii: is number of months, use any number other than (**2**)

            con.Open();

            SqlCommand cmd10 = con.CreateCommand();
            cmd10.CommandType = CommandType.Text;
            cmd10.CommandText = "select count(id_post) from posts where dateadded between CONVERT(VARCHAR, @start, 103) and CONVERT(VARCHAR, @end, 103)";
            cmd10.Parameters.AddWithValue("@start", "" + iii + "/01/2019");
            cmd10.Parameters.AddWithValue("@end", "" + iii + "/30/2019");
            string result = cmd10.ExecuteScalar().ToString();

            con.Close();

            return result;
        }

现在要测试

 lbl1.Text = GetCountArchiveByMonth(**7**).ToString();  // here use any number other than (**2**)

**

  

由于支票**February**的使用期限最长为 28 天,

**