繁体   English   中英

从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

但我收到此错误:

从字符串转换日期和/或时间时转换失败。

您的方法未考虑monthday可以是个位数的值。 如果您有这样的行:

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需要更多的存储空间,更不用说smallinttinyint

所以,这对我来说似乎很好

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM