将数据类型 varchar 转换为日期时将 int 年份转换为字符串时出错

Posted

技术标签:

【中文标题】将数据类型 varchar 转换为日期时将 int 年份转换为字符串时出错【英文标题】:Error converting data type varchar to date converting an int year into a string 【发布时间】: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() 中相同的日期格式 【参考方案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)

【讨论】:

以上是关于将数据类型 varchar 转换为日期时将 int 年份转换为字符串时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 varchar 值“Collect_Date”转换为数据类型 int 时转换失败

将 varchar 值“%”转换为数据类型 int 时转换失败

在sql中如何将日期类型转换成文本类型,例如2012-09-12 转变成 20120912

将 varchar 值“AND ID =”转换为数据类型 int 时转换失败

将 varchar 值转换为数据类型 int 时转换失败

如何在 MySQL 中使用 Case When 和 Str_to Date 将 Varchar 日期值转换为日期数据类型