仅限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