将 CHAR 转换为 DATETIME 以便我可以使用 DATEADD()

Hec*_*tor 6 sql-server t-sql type-conversion datetime

我有一个关于将DATEADD()函数用于标识为的列的问题CHAR (6)

time_stamp列包含类似131329as 的值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)

如果您发现该查询丑陋而乏味,那很好!有一个很好的理由:您存储的数据错误

这也不会是您在此设计中遇到的最后一个问题。是什么阻止了某人在您的专栏中插入967286foobar或?如果您需要解决该问题,您可以在 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)