在 SQL 开发者中设置时间范围

setting time range in SQL Developer

我正在处理包含车祸及其发生时间的数据集。 (数据集存在于 SQL 服务器中,名称为 accident)。

我有一个 date 格式的专栏。我想从列中提取时间。然后添加一个名为 lightining_period 的新列,将时间标记为 daytimenighttime。我的问题是设置时间范围,因为每次我 运行 代码时都会得到错误的标签。

Different lighting periods (daytime: 6AM - 5:59PM and nighttime 6PM - 5:59AM).

[1]首先,我编写了这段代码以从 accident_date_time 中提取时间并将其存储在新列 time

create table lightiningPeriod as 
select to_char(accident_date_time,'HH:MMAM') as time
from accident.accident;

[2]然后,我更改了 table 以添加列 lightining_label,我想在其中存储标签 daytime/nighttime.

alter table lightiningPeriod add (
lightining_label varchar2(20)
);

[3]最后,我使用 Update 语句根据 time 范围更改 lightining_label 的值。但是 table 出现错误。我尝试使用 betweento_datecastconvert 但其中 none 有效。

update lightiningPeriod
set lightining_label='daytime'
where time >= '06:00AM'
and time <= '5:59PM';

下面是我得到的显示错误标签的输出示例。

time    lightining_label
06:04AM daytime
11:04AM daytime
01:04AM (null)
10:04AM daytime
10:04AM daytime
04:04PM (null)
07:04PM daytime
01:04PM (null)

看起来 time 列正在使用字符串类型(VARCHARNVARCHAR)而不是 TIME。所以你比较字符串值而不是时间值。

您可以使用 CONVERT 来比较字符串值,例如时间值:

UPDATE lightiningPeriod
  SET lightining_label = CASE WHEN CONVERT(TIME, [time]) BETWEEN CONVERT(TIME, '06:00AM') AND CONVERT(TIME, '5:59PM') THEN 'daytime' ELSE 'nighttime' END

demo on dbfiddle.uk

我建议使用 TIME data type.

将时间值存储在列中

这是对塞巴斯蒂安回答的一个调整。在 SQL 服务器中,您可以使用计算列:

ALTER TABLE lightiningPeriod
  ADD lightining_label AS (CASE WHEN CONVERT(TIME, [time]) >= CONVERT(TIME, '06:00:00') AND CONVERT(TIME, [time]) < CONVERT(TIME, '18:00:00')
                                THEN 'daytime' ELSE 'nighttime'
                           END)

然后在查询table时计算标签,所以它总是正确的。

谢谢大家,我已经解决了这个查询:

update lightiningPeriod
set lightining_label='daytime'
where to_char(accident_date_time, 'hh24:mi') >= '06:00'
and to_char(accident_date_time, 'hh24:mi') <= '17:59';