Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅限Oracle的时间限制_Oracle - Fatal编程技术网

仅限Oracle的时间限制

仅限Oracle的时间限制,oracle,Oracle,我有两列start\u time和end\u time。类型为DATE 我想做一个约束,规定start\u time低于end\u time。日期部分也不重要。 因此,如果这两个变量是: 开始时间:2017-01-02 11:40 完:2017-01-01 12:40 这是真的 我该怎么做呢?其中一个日期格式掩码是“sssss”,它给出午夜后的秒数。因此,您可以像这样强制执行约束: alter table your_table add constraint start_end_ran

我有两列
start\u time
end\u time
。类型为
DATE

我想做一个约束,规定
start\u time
低于
end\u time
。日期部分也不重要。 因此,如果这两个变量是: 开始时间:2017-01-02 11:40 完:2017-01-01 12:40

这是真的


我该怎么做呢?

其中一个日期格式掩码是
“sssss”
,它给出午夜后的秒数。因此,您可以像这样强制执行约束:

 alter table your_table 
    add constraint start_end_range_ck as 
    check (to_number(to_char(start_date, 'sssss')) < to_number(to_char(end_date, 'sssss')))
/
更改您的表
添加约束开始\u结束\u范围\u检查为
检查(至字符(至字符(开始日期,'sssss'))<至字符(至字符(结束日期,'sssss')))
/

或者您想要
其中一个日期格式掩码是
'sssss'
,它给出午夜后的秒数。因此,您可以像这样强制执行约束:

 alter table your_table 
    add constraint start_end_range_ck as 
    check (to_number(to_char(start_date, 'sssss')) < to_number(to_char(end_date, 'sssss')))
/
更改您的表
添加约束开始\u结束\u范围\u检查为
检查(至字符(至字符(开始日期,'sssss'))<至字符(至字符(结束日期,'sssss')))
/

或者你想要
有多种方法可以做到这一点;我喜欢APC的
sssss
方法,但Tim关于使用字符串的建议也很有效:

check (to_char(start_time, 'HH24:MI:SS') < to_char(end_time, 'HH24:MI:SS'))
检查(到字符(开始时间,'HH24:MI:SS')<到字符(结束时间,'HH24:MI:SS'))
或者,您可以通过从自身中减去截断值(这实际上为您提供了两个数字,是APC的1/86400),得到每天的小数部分:

检查(开始时间-trunc(开始时间)
如果您真的想将其视为日期,您可以将这些数字添加回标称日期:

check (date '1900-01-01' + (start_time - trunc(start_time))
  < date '1900-01-01' + (end_time - trunc(end_time)))
检查(日期“1900-01-01”+(开始时间-trunc(开始时间))
<日期'1900-01-01'+(结束时间-TRUC(结束时间)))
或者根据它们之间的差异修改一个值日期部分,这可能最接近您(可能放错位置)避免类型转换的愿望:

check_times check (start_time + (trunc(end_time) - trunc(start_time)) < end_time)
检查时间检查(开始时间+(trunc(结束时间)-trunc(开始时间))
或者,如果您真的想要明确,您可以提取每个时间元素并单独比较它们:

check (
  extract(hour from cast(start_time as timestamp)) < extract(hour from cast(end_time as timestamp))
  or (
    extract(hour from cast(start_time as timestamp)) = extract(hour from cast(end_time as timestamp))
    and extract(minute from cast(start_time as timestamp)) < extract(minute from cast(end_time as timestamp))
  )
  or (
    extract(hour from cast(start_time as timestamp)) = extract(hour from cast(end_time as timestamp))
    and extract(minute from cast(start_time as timestamp)) = extract(minute from cast(end_time as timestamp))
    and extract(second from cast(start_time as timestamp)) < extract(second from cast(end_time as timestamp))
  )
)
检查(
提取(从强制转换开始的小时数(开始时间作为时间戳))<提取(从强制转换开始的小时数(结束时间作为时间戳))
或(
提取(从强制转换开始的小时数(开始时间作为时间戳))=提取(从强制转换开始的小时数(结束时间作为时间戳))
和提取(从cast开始的分钟(开始时间作为时间戳))

但这显然开始变得有点愚蠢,并且仍然进行类型转换,因为您必须将日期转换为时间戳,以便能够首先提取时间组件…

有多种方法可以做到这一点;我喜欢APC的
sssss
方法,但Tim关于使用字符串的建议也很有效:

check (to_char(start_time, 'HH24:MI:SS') < to_char(end_time, 'HH24:MI:SS'))
检查(到字符(开始时间,'HH24:MI:SS')<到字符(结束时间,'HH24:MI:SS'))
或者,您可以通过从自身中减去截断值(这实际上为您提供了两个数字,是APC的1/86400),得到每天的小数部分:

检查(开始时间-trunc(开始时间)
如果您真的想将其视为日期,您可以将这些数字添加回标称日期:

check (date '1900-01-01' + (start_time - trunc(start_time))
  < date '1900-01-01' + (end_time - trunc(end_time)))
检查(日期“1900-01-01”+(开始时间-trunc(开始时间))
<日期'1900-01-01'+(结束时间-TRUC(结束时间)))
或者根据它们之间的差异修改一个值日期部分,这可能最接近您(可能放错位置)避免类型转换的愿望:

check_times check (start_time + (trunc(end_time) - trunc(start_time)) < end_time)
检查时间检查(开始时间+(trunc(结束时间)-trunc(开始时间))
或者,如果您真的想要明确,您可以提取每个时间元素并单独比较它们:

check (
  extract(hour from cast(start_time as timestamp)) < extract(hour from cast(end_time as timestamp))
  or (
    extract(hour from cast(start_time as timestamp)) = extract(hour from cast(end_time as timestamp))
    and extract(minute from cast(start_time as timestamp)) < extract(minute from cast(end_time as timestamp))
  )
  or (
    extract(hour from cast(start_time as timestamp)) = extract(hour from cast(end_time as timestamp))
    and extract(minute from cast(start_time as timestamp)) = extract(minute from cast(end_time as timestamp))
    and extract(second from cast(start_time as timestamp)) < extract(second from cast(end_time as timestamp))
  )
)
检查(
提取(从强制转换开始的小时数(开始时间作为时间戳))<提取(从强制转换开始的小时数(结束时间作为时间戳))
或(
提取(从强制转换开始的小时数(开始时间作为时间戳))=提取(从强制转换开始的小时数(结束时间作为时间戳))
和提取(从cast开始的分钟(开始时间作为时间戳))

但这显然开始变得有点愚蠢,而且仍然会进行类型转换,因为首先必须将日期转换为时间戳才能提取时间成分…

比较
到字符(开始时间,'HH24:MI:SS')
到字符(结束时间,'HH24:MI:SS'))
它不是重复的,因为它是一个约束而不是一个查询,我不想将它转换为字符。它是疯狂的。为什么将它们作为字符串进行比较是疯狂的?您的问题意味着您知道如何进行检查约束,但不知道如何仅处理时间部分;链接的问题(加上Tim的评论)展示了如何完成这一部分。正如我所知,约束和查询之间有一些区别。但我不确定。将日期转换为字符串以进行比较似乎不是一个好的解决方案。应该有一种不需要类型转换的方法。我不知道Oracle,但在任何其他编程语言中,这样做都是错误的。但你不是在比较日期,而是在比较日期中最不重要的部分,因此你必须以某种方式提取/操作/转换它们。你可以操纵它们到sa