![](/img/trans.png)
[英]Conversion failed when converting date and/or time from character string SQL
[英]Conversion failed when converting date and/or time from character string in SQL
我的表中有以下几列:
year decimal(4,0)
month decimal(2,0)
day decimal(2,0)
我正在尝试将它们转换如下:
SELECT (CAST (CAST(year AS varchar(4))
+CAST(month AS varchar(2))
+CAST(day AS varchar(2)
) AS date ) ) AS xDate
FROM table
ORDER BY xDate DESC
但我收到此错误:
从字符串转换日期和/或时间时转换失败。
您的方法未考虑month
或day
可以是个位数的值。 如果您有这样的行:
year month day
---- ----- ---
2014 7 18
您的方法会将这些部分串联为2014718
,随后尝试将其转换为date
将导致相关错误。
您可能打算合并以下部分: 20140718
,它将转换为date
没有问题的部分。 对我而言,从数字部分获取该格式的最简单方法是:
计算year * 10000 + month * 100 + day
;
将先前的结果转换为char(8)
;
将字符串转换为date
。
因此,在Transact-SQL中,它将是这样的:
CAST(CAST(year * 10000 + month * 100 + day AS char(8)) AS date)
另一方面,我当然不能知道您是否真的需要像这样存储日期分割,但是,如果您确实坚持这样做,至少要考虑对零件使用整数类型。 我意识到, decimal(2,0)
可能会为您提供某种约束,以确保您不能拥有超过2位数字的月或日值,但仍不能保护您免受无效的月或日影响。 还有一个要点是, decimal(2,0)
比int
需要更多的存储空间,更不用说smallint
或tinyint
。
所以,这对我来说似乎很好
year int,
month int,
day int
但是如果您想尽可能地节省存储空间,也可以尝试以下操作:
year smallint,
month tinyint,
day tinyint
最后,要确保这些列中不能包含无效值,可以添加如下所示的检查约束:
ALTER TABLE
ADD CONSTRAINT CK__yearmonthday CHECK
ISDATE(CAST(year * 10000 + month * 100 + day AS char(8))) = 1
;
此问题是因为您的表中有冗余数据(查询没有问题)。 检查表中的以下内容。
1)。 天列的值不能大于关联月份的最大天数(例如,第二个月中不能有30天或31天)。
2)。 月列的值不能大于12或等于0 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.