Sql 如何更新datetime字段以仅包含日期或时间部分

Sql 如何更新datetime字段以仅包含日期或时间部分,sql,firebird,Sql,Firebird,如何更新包含日期/时间信息的字段,使其仅包含数据的日期部分?如下所示: update [EVENTS] SET [EVENT_DATE] = DATEADD(dd, 0, DATEDIFF(dd, 0, [EVENT_DATE]) WHERE EVENT_NUM = '8592' 我还需要获得等效值,才能将其设置为时间组件?您可以使用CAST()函数: update EVENTS set EVENT_DATE = cast(cast(EVENT_DATE as varchar(11

如何更新包含日期/时间信息的字段,使其仅包含数据的日期部分?如下所示:

update [EVENTS]
  SET [EVENT_DATE] = DATEADD(dd, 0, DATEDIFF(dd, 0, [EVENT_DATE])
  WHERE EVENT_NUM = '8592'
我还需要获得等效值,才能将其设置为时间组件?

您可以使用CAST()函数:

update EVENTS
  set EVENT_DATE = cast(cast(EVENT_DATE as varchar(11)) as date)
  where EVENT_NUM = '8592'

您可以通过强制转换将
时间戳
截断为
日期
时间

cast(EVENT_DATE as DATE)
cast(EVENT_DATE as TIME)
Firebird 2.5语言参考和Interbase 6嵌入式SQL指南第188页的“从SQL数据类型转换为datetime数据类型”一节中也记录了这一点。本手册可从Firebird网站获得


这只适用于方言3。如果您仍在使用方言1数据库,则需要使用中间转换到
VARCHAR
(特定于语言环境的长度为10或11),如中所示,以去除时间部分。这是因为方言1中的
DATE
实际上是一个时间戳(而不仅仅是一个日期)。

您不需要强制转换为varchar,直接将时间戳强制转换为DATE!可能这取决于使用的方言和作品的方言3。我使用方言1的数据库,首先我必须转换为varchar,因为如果我使用case-to-date,它将不会删除时间。这是因为在方言1中(顺便说一句,它自2000年以来就被弃用),日期是时间戳。您的技巧之所以有效,是因为使用
VARCHAR(11)
将删除时间信息。