相关文章推荐
才高八斗的茶叶  ·  Exemple de cookie ...·  1 年前    · 
睿智的小熊猫  ·  vue+iview ...·  1 年前    · 

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

5 人关注

我有一个表,其中有一列存储日期和时间。我需要写一个查询,从该列中只获取日期。

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

但是,当我运行这个查询时,我得到了这个错误。

将varchar数据类型转换为datetime数据类型的结果是一个超出范围的值。

该列中的数据是数据时间,例如:2012-06-18 12:08:04.000 所以我需要只提取日期,删除时间。 注意,[Logintime]列是数据时间格式。

4 个评论
Adil
让我们看看你在varchar字段中的日期格式是什么?
Dgan
在哪个日期格式下?
这是日期的格式 [2012-06-18 12:08:09.000]
sql
sql-server
sql-server-2008
datetime
Noora
Noora
发布于 2015-02-02
5 个回答
Sarath KS
Sarath KS
发布于 2019-05-13
已采纳
0 人赞同

尝试在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
    

    EDIT 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数据类型转换为datetime数据类型的结果是 导致一个超出范围的值。

    因此,请确保用mm/dd/yyyydd/mm/yyyy 格式来过滤日期,以你的数据库中的格式为准。

    @sarath发布的最后一个查询可以正常工作,但是当我使用where语句在日期之间进行比较时,它不能工作 SELECT CONVERT(VARCHAR, LoginTime, 101) FROM AuditTrail where CONVERT(VARCHAR, LoginTime, 101) <= '06/18/2012'
    尝试用 where CAST(CONVERT(VARCHAR, LoginTime, 101) AS DATE) <= CAST('06/18/2012' AS DATE) @Noora
    我得到了[当从字符串转换日期和/或时间时,转换失败]。
    你能给我看看你想做的查询吗?@Noora
    同上写的询问
    Vahid Farahmandian
    Vahid Farahmandian
    发布于 2019-05-13
    0 人赞同

    希望这能帮助你。

    SELECT  CAST(LoginTime AS DATE)
             FROM    AuditTrail 
    

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

    Marcello Miorelli
    Marcello Miorelli
    发布于 2019-05-13
    0 人赞同

    正如你在这个问题的答案上可以看到的那样。 将varchar数据类型转换为datetime数据类型的结果是超出范围的值

    -- 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)
        
    Magne Brenås
    Magne Brenås
    发布于 2019-05-13
    0 人赞同

    我也在为同样的问题挣扎。我在SQL Server中用 "YYYY-MM-DD HH:NN:SS "的格式存储日期已经有20年了,但是今天我用OleDbCommand和UPDATE查询的C#解决方案已经无法做到这一点。

    解决我问题的方法是去掉格式中的连字符-,所以现在的格式是 "YYYMMDD HH:MM:SS"。我不知道为什么我以前的格式化不再起作用了,但我怀疑这与Windows的一些ADO.NET更新有关。

    Abdelhakim Ezzahraoui
    Abdelhakim Ezzahraoui
    发布于 2019-05-13
    0 人赞同

    一些问题,但我找到了解决方案,这是。

     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**)