我需要一个查询,通过保留日期但更改时间来更新约会日期的时间。 例如
2016年2月10日09:00:00 我想把它改成10-Feb-2016 10:00:00。
Update Appointment
set vdate = '10:00:00'
where vdate= '10-Feb-2016'
我得到“0行已更新”。不确定我是否遗漏了什么。 提前谢谢。
答案 0 :(得分:3)
您可以使用trunc()
将DATE
(或TIMESTAMP
)的时间部分设置为00:00:00
,然后将10小时添加到其中:
Update Appointment
set vdate = trunc(vdate) + interval '10' hour
where trunc(vdate) = DATE '2016-02-10'
这会更改日期为2016-02-10
的所有行。如果您只想为那些在09:00(忽略分钟和秒)的人那样做,那么只需向这些行添加一小时
Update Appointment
set vdate = trunc(vdate) + interval '1' hour
where trunc(vdate, 'hh24') = timestamp '2016-02-10 09:00:00'
trunc(vdate, 'hh24')
会将date
值的分钟和秒设置为00:00
,以便与2016-02-10 09:00:00
进行比较。
无关,但是:不依赖于隐式数据类型转换。 '10-Feb-2016'
是字符串值,而不是DATE文字。要指定日期要么使用ANSI DATE文字(正如我在上面的语句中所做的那样),要么使用to_date()
函数和格式掩码将字符串文字转换为正确的日期值。
您的语句受到恶意隐式数据类型转换的影响,如果运行该语句的SQL客户端使用不同的NLS设置(例如,它将在我的计算机上失败),则会失败。
答案 1 :(得分:0)
试试这样。
UPDATE MyTable
SET MyDate = DATEADD(HOUR, 4, CAST(CAST(MyDate AS DATE) AS DATETIME))
或
UPDATE MyTable
SET MyDate = DATEADD(HOUR, 4, CAST(FLOOR(CAST(MyDate AS FLOAT)) AS DATETIME))
答案 2 :(得分:0)
如果你想要做的是在一个日期添加一个小时,那么你可以这样做:
Update Appointment
set vdate = vdate + 1/24
where vdate = to_date('10/02/2016 09:00', 'dd/mm/yyyy hh24:mi');
因为在Oracle中,日期差异以天数衡量,一小时是一天的1/24。
如果你想要做的是指定一个确切的时间(例如到10:25:48),那么你可以改为:
Update Appointment
set vdate = trunc(vdate) + 10/24 + 25/(24*60) + 48/(24*60*60)
where vdate = to_date('10/02/2016 09:00', 'dd/mm/yyyy hh24:mi');
请记住,这些更新将更新日期为2016年2月10日上午9点的所有行。如果要指定更具体的行或行集,则需要更改查询的where子句。