Hec*_*tor 6 sql-server t-sql type-conversion datetime
我有一个关于将DATEADD()
函数用于标识为的列的问题CHAR (6)
该time_stamp
列包含类似131329
as 的值hhmmss
。每当我尝试创建一个新列来保存列的值time_stamp
+ 5 分钟时,我都会收到错误消息。
消息 242,级别 16,状态 3,第 1 行
字符数据类型到日期时间数据类型的转换导致日期时间值超出范围。`
我想要做的是创建一个新列,它比time_stamp
. 我现在正在处理一份显示“已完成订单”的报告,但我需要该报告将订单显示为“未完成”至少 5 分钟,然后才能在报告中显示为“已完成”。
Aar*_*and 13
好吧,首先,您应该使用正确类型的列修复您的表格并存储日期/时间数据,而不是因为未知原因而将其分解。将时间存储为 a 的决定是谁决定的CHAR(6)
?你能想到一个很好的理由吗?你在哪里存储日期?是今天下午 1 点、上周二还是 2012 年 10 月的某个时间?这确实应该是单个日期时间列。有“设计师”请阅读这个和这个。
但除此之外(有趣的是,每次您建议更换桌子时,他们都说他们不能更换桌子):
DECLARE @x TABLE(y CHAR(6));
INSERT @x(y) VALUES('131329');
SELECT DATEADD(MINUTE,5,CONVERT(TIME(0),STUFF(STUFF(y,5,0,':'),3,0,':')))
FROM @x;
Run Code Online (Sandbox Code Playgroud)
结果:
13:18:29
Run Code Online (Sandbox Code Playgroud)
如果您发现该查询丑陋而乏味,那很好!有一个很好的理由:您存储的数据错误。
这也不会是您在此设计中遇到的最后一个问题。是什么阻止了某人在您的专栏中插入967286
或foobar
或?如果您需要解决该问题,您可以在 2012 年及更高版本中使用(请始终使用特定于版本的标签指定版本),或早期版本中的表达式。<empty string>
CHAR(6)
TRY_CONVERT()
CASE
DECLARE @x TABLE(y CHAR(6));
INSERT @x(y) VALUES('foobar');
-- 2012:
SELECT DATEADD(MINUTE,5,TRY_CONVERT(TIME(0), STUFF(STUFF(y,5,0,':'),3,0,':')))
FROM @x;
-- older:
SELECT DATEADD(MINUTE,5,CONVERT(TIME(0),
CASE WHEN ISDATE(STUFF(STUFF(y,5,0,':'),3,0,':'))=1 THEN
STUFF(STUFF(y,5,0,':'),3,0,':') END))
FROM @x;
Run Code Online (Sandbox Code Playgroud)