我有一个小查询从日期时间字段中删除日期,但是当我尝试将其从GMT转换为CST时,它会读取日期。有更好的方法吗?
位置表:
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
4-6-2018 12:35:43
此查询将给出读取日期。如何在不读取日期的情况下删除日期然后执行dateadd功能
答案 0 :(得分:1)
arrival
似乎是一个DateTime,它总是带有日期部分。您需要time
,而SQL Server 2008 +支持:
cast(DATEADD(hour,-5,arrival) as time)
答案 1 :(得分:1)
这可能就是你所要求的:
SELECT Convert(Varchar(8), DATEADD(hour,-5,arrival), 108)
FROM locations;
注意:这与没有Time数据类型的SQL Server版本兼容。
答案 2 :(得分:1)
引用DATEADD
(Transact-SQL) - Return Types:
返回数据类型是date参数的数据类型,但字符串文字除外。 字符串文字的返回数据类型是datetime 。如果字符串文字秒刻度超过三个位置(.nnn)或包含时区偏移部分,则会引发错误。
强调我自己。
当您传递字符串(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)