【问题标题】:Error converting data type varchar to date converting an int year into a string将数据类型 varchar 转换为日期时将 int 年份转换为字符串时出错
【发布时间】:2018-10-22 14:47:01
【问题描述】:

我有 SchoolYear 变量作为 INT,我正在尝试为此设置一个变量:

SET @BeginDate = '07/01/' + CONVERT(VARCHAR(4), @SchoolYear - 1)    

它给了我“将数据类型 varchar 转换为日期时出错”错误。

示例:

@SchoolYear INT = 2019,

@BeginDate 日期 - NULL

期望的结果:

2018 年 7 月 1 日

请问我做错了什么?

【问题讨论】:

  • 尝试设置成格式'yyyy-mm-dd'
  • @jm1 尝试将@BeginDate 数据类型更改为DATE
  • @iSR5,BeginDate 是一个日期,我更新了问题。感谢您的帮助。
  • @JM1 执行此SELECT GETDATE() 并检查它的日期格式,您应该使用与GETDATE() 中相同的日期格式

标签: sql sql-server tsql


【解决方案1】:

查看DATEFROMPARTS(可从 SQL 2012 获得),并完全绕过字符串。

SET @BeginDate = DATEFROMPARTS(@SchoolYear - 1, 1, 7)

第一个参数 = 年,第二个 = 月,第三个 = 日。

【讨论】:

    【解决方案2】:

    你使用的格式根本不被你的 sql server 理解。

    在处理 varchar 列/变量中的日期时,最好使用语言中性的日期格式。
    yyyyMMdd 就是这样一种格式,无论您的服务器上使用什么区域设置,它都将始终有效.

    另见http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

    在你的情况下,你应该使用

    SET @BeginDate = CONVERT(VARCHAR(4), @SchoolYear - 1) + '0107'
    

    假设 01 是月份,07 是日期,所以你最终会得到20180107

    最好在转换时避免 varchar 完成,像这样

    set @BeginDate =  DATEFROMPARTS(@SchoolYear - 1, 1, 7)
    

    【讨论】:

      【解决方案3】:

      也许您应该使用 yyyy-mm-dd 格式并将集合更改为:

      SET @BeginDate = CONVERT(VARCHAR(4), @SchoolYear - 1)+ '-01-07' 
      

      【讨论】:

        【解决方案4】:
        Declare @SchoolYear int
        Set @SchoolYear = 2019
        Declare @BeginDate varchar(50)
        SET @BeginDate = '07/01/' + CONVERT(VARCHAR(4), @SchoolYear - 1)    
        --Once You have you varchar populated, you can use Convert Function to convert
        --to datetime and select the format you want
        
        Select CONVERT (Datetime,@BeginDate, 101)
        

        【讨论】:

          猜你喜欢
          • 2011-03-29
          • 1970-01-01
          • 2013-01-15
          • 2021-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-27
          相关资源
          最近更新 更多