在 SQL 开发者中设置时间范围
setting time range in SQL Developer
我正在处理包含车祸及其发生时间的数据集。 (数据集存在于 SQL 服务器中,名称为 accident)。
我有一个 date
格式的专栏。我想从列中提取时间。然后添加一个名为 lightining_period
的新列,将时间标记为 daytime 或 nighttime。我的问题是设置时间范围,因为每次我 运行 代码时都会得到错误的标签。
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 出现错误。我尝试使用 between、to_date、cast、convert 但其中 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
列正在使用字符串类型(VARCHAR
、NVARCHAR
)而不是 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
我建议使用 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';
我正在处理包含车祸及其发生时间的数据集。 (数据集存在于 SQL 服务器中,名称为 accident)。
我有一个 date
格式的专栏。我想从列中提取时间。然后添加一个名为 lightining_period
的新列,将时间标记为 daytime 或 nighttime。我的问题是设置时间范围,因为每次我 运行 代码时都会得到错误的标签。
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 出现错误。我尝试使用 between、to_date、cast、convert 但其中 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
列正在使用字符串类型(VARCHAR
、NVARCHAR
)而不是 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
我建议使用 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';