在SQL Developer中设置时间范围

在SQL Developer中设置时间范围,sql,sql-server-2008,time,range,where-clause,Sql,Sql Server 2008,Time,Range,Where Clause,我正在研究一个包含车祸及其发生时间的数据集。(该数据集在SQL Server中的名称为意外) 我有一列是date格式的。我想从专栏中摘录时间。然后添加一个名为lightining\u period的新列,将时间标记为白天或夜间。我的问题是设置时间的范围,因为每次运行代码时我都会得到错误的标签 不同的照明时段(白天:上午6点至下午5点59分,夜间6点至下午5点59分) [1] 首先,我编写这段代码是为了从事故日期时间中提取时间,并将其存储在一个新的列时间 create table lightini

我正在研究一个包含车祸及其发生时间的数据集。(该数据集在SQL Server中的名称为意外

我有一列是
date
格式的。我想从专栏中摘录时间。然后添加一个名为
lightining\u period
的新列,将时间标记为白天夜间。我的问题是设置时间的范围,因为每次运行代码时我都会得到错误的标签

不同的照明时段(白天:上午6点至下午5点59分,夜间6点至下午5点59分)

[1] 首先,我编写这段代码是为了从
事故日期时间
中提取时间,并将其存储在一个新的列
时间

create table lightiningPeriod as 
select to_char(accident_date_time,'HH:MMAM') as time
from accident.accident;
[2] 然后,我修改了表,添加了列
lightining\u label
,我想在其中存储白天/夜间的标签

alter table lightiningPeriod add (
lightining_label varchar2(20)
);
[3] 最后,我使用Update语句根据
time
范围更改
lightining\u label
的值。但是这些桌子都错了。我试着在之间使用到日期演员转换,但没有一个有效

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

看起来
time
列使用的是字符串类型(
VARCHAR
NVARCHAR
)而不是
time
。所以比较字符串值而不是时间值

您可以使用以下方法来比较字符串值,如时间值:

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
列使用的是字符串类型(
VARCHAR
NVARCHAR
),而不是
time
。所以比较字符串值而不是时间值

您可以使用以下方法来比较字符串值,如时间值:

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


我建议使用将时间值存储在列上。

这是对Sebastian答案的调整。在SQL Server中,可以使用计算列:

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)
ALTER TABLE lightiningPeriod
将Lightning_标签添加为(CONVERT(TIME,[TIME])>=CONVERT(TIME,'06:00:00')和CONVERT(TIME,[TIME])

然后在查询表时计算标签,因此它总是正确的。

这是对Sebastian答案的调整。在SQL Server中,可以使用计算列:

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)
ALTER TABLE lightiningPeriod
将Lightning_标签添加为(CONVERT(TIME,[TIME])>=CONVERT(TIME,'06:00:00')和CONVERT(TIME,[TIME])

然后在查询表时计算标签,因此它总是正确的。

谢谢大家,我已通过以下操作解决了查询:

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';
更新照明周期
设置照明标签“白天”
去哪里(事故日期时间,'hh24:mi')>='06:00'

对于_char(事故日期时间,'hh24:mi')谢谢大家,我已经通过以下方式解决了查询:

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';
更新照明周期
设置照明标签“白天”
去哪里(事故日期时间,'hh24:mi')>='06:00'

以及to_char(事故日期时间,'hh24:mi')to_char?那是oracle,不是吗?“我有一个日期格式的列。我想从该列中提取时间”-恐怕没有任何意义。看起来你是在进行文本到文本的比较,而不是时间到时间的比较?原始列是日期格式的。我正在使用to_char提取时间。tochar和varchar2不是sql server-修复您的标记。使用错误的方法只会使寻找解决方案的时间更长,而且会产生误导。删除了sql server并添加了oracle,但您可能正在使用其他内容?那是oracle,不是吗?“我有一个日期格式的列。我想从该列中提取时间”-恐怕没有任何意义。看起来你是在进行文本到文本的比较,而不是时间到时间的比较?原始列是日期格式的。我正在使用to_char提取时间。tochar和varchar2不是sql server-修复您的标记。使用错误的方法只会使寻找解决方案的时间更长,而且会产生误导。删除了sql server并添加了oracle,但您可能使用了其他内容。请注意,我的标题放错了。我使用的是SQLDeveloper。您能否修改您的答案以使用sql developer?感谢you@leena . . . 问一个新问题,并适当地贴上标签。此问题已有多个答案,更改问题或标签将使答案无效。抱歉,我输入了错误的标题。我使用的是SQLDeveloper。您能否修改您的答案以使用sql developer?感谢you@leena . . . 问一个新问题,并适当地贴上标签。此问题已有多个答案,更改问题或标签将使答案无效。我的标题出错。我正在使用sql developer而不是server。我在标题上犯了一个错误。我正在使用sql开发人员而不是服务器。