使用 DATEADD 后如何转换值

How do I convert a value after using DATEADD with it

我有一个从日期时间字段中删除日期的小查询,但是当我尝试将其从 GMT 转换为 CST 时,它会读取日期。有更好的方法吗?

位置table:

arrival
4-6-2018 12:35:43




SELECT arrival
FROM(
SELECT CONVERT(VARCHAR(8), arrival))
FROM locations
)a

这个查询会给我这个结果:

12:35:43

SELECT (DATEADD(hour,-5,arrival))
FROM(
SELECT CONVERT(VARCHAR(8), arrival))
FROM locations
)a

2018 年 4 月 6 日 12:35:43

此查询将提供读取日期。如何删除日期,然后在不读取日期的情况下执行 dateadd 函数

arrival 好像是一个DateTime,总是带有日期部分。您需要一个 time,由 SQL Server 2008+ 支持:

cast(DATEADD(hour,-5,arrival) as time)

可能这就是您要的:

SELECT Convert(Varchar(8), DATEADD(hour,-5,arrival), 108)
FROM locations;

注意:这与 SQL 没有时间数据类型的服务器版本兼容。

引用自DATEADD (Transact-SQL) - Return Types

The return data type is the data type of the date argument, except for string literals. The return data type for a string literal is datetime. An error will be raised if the string literal seconds scale is more than three positions (.nnn) or contains the time zone offset part.

强调我自己的。

当您传递一个字符串 (varchar) 时,DATEADD 将返回一个 datetime

就像评论中所说的那样,如果您使用正确的数据类型 (time),这个问题就会消失:

SELECT DATEADD(HOUR, -5,CONVERT(time,Arrival))
FROM (VALUES('4-6-2018 12:35:43'),('4-6-2018 07:35:43'),('4-6-2018 03:35:43')) V(Arrival)