Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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
Sql 如何通过“截止日期”功能进行搜索?_Sql_Oracle - Fatal编程技术网

Sql 如何通过“截止日期”功能进行搜索?

Sql 如何通过“截止日期”功能进行搜索?,sql,oracle,Sql,Oracle,我的表格如下: 表Temp: ID MAX MIN DATE_C 1 34 24 21-APR-17 02.41.38.520000 PM 2 32 26 20-APR-17 02.42.44.569000 PM 我执行以下SQL查询,以获取各个日期的温度详细信息: SELECT * FROM Temp t WHERE t.date_c = TO_DATE( '2017-04-21', 'YYYY-MM-DD') order by t.id 但它返回的是空记录。

我的表格如下:

Temp

ID  MAX MIN DATE_C  
1   34  24  21-APR-17 02.41.38.520000 PM    
2   32  26  20-APR-17 02.42.44.569000 PM
我执行以下SQL查询,以获取各个日期的温度详细信息:

SELECT *
FROM Temp t
WHERE t.date_c = TO_DATE( '2017-04-21', 'YYYY-MM-DD')
order by t.id

但它返回的是空记录。我的查询有什么问题?

您需要删除列上的时间组件。这里有一个方法:

SELECT *
FROM Temp t
WHERE TRUNC(t.date_c) = DATE '2017-04-21'
ORDER BY t.id;
但是,我通常建议使用不等式,而不是列上的函数:

SELECT *
FROM Temp t
WHERE t.date_c >= DATE '2017-04-21' AND
      t.date_c < DATE '2017-04-22'
ORDER BY t.id;
选择*
从温度t
其中t.date_c>=日期“2017-04-21”和
t、 日期<日期“2017-04-22”
按t.id订购;

这允许查询在
date\u c
上使用索引。我应该补充一点,原始版本可以在
上使用索引(trunc(date_c,id)
21-APR-17 02.41.38.520000 PM
不是
日期
;它有一个小数秒组件,因此它是
时间戳

因此,如果您想查找某一天的项目(使用

选择*
临时工
其中日期>=时间戳“2017-04-21 00:00:00”和
日期<时间戳'2017-04-21 00:00:00'+间隔'1'天;

选择*
临时工
其中date_c>=TO_时间戳(:您的_date_字符串'YYYY-MM-DD'),并且
日期<到时间戳(:您的日期字符串'YYYY-MM-DD')+间隔'1'天;
它正在返回空记录。我的查询有什么问题


date\u c=TO\u date('2017-04-21','YYYY-MM-DD')
匹配
date\u c
值正好为
2017-04-21 00:00:00.000000
(包括时间成分)的所有行;如果您没有任何与该日期和时间完全一致的行,那么正如您所注意到的,它将不返回任何内容。如果您希望获得与该日期匹配的记录,则需要在一天的开始和结束之间的时间范围内获取值。

您需要在列上传递日期。以下是一种方法

SELECT *
FROM Temp t
WHERE CAST(t.CREATED_ON as date)= N'2017-04-22'
ORDER BY t.id

DATE关键字是否自动检测日期格式?@SAPDEV…关键字
DATE
允许使用ANSI标准格式(它实际上是一个ANSI标准关键字)。我只使用YYYY-MM-DD格式,因此我从未尝试过使用其他格式。
DATE
literal只接受ANSI格式:ANSI日期文本不包含时间部分,并且必须完全按照此格式指定(“YYYY-MM-DD”)。使用
CAST(DATE\u c AS DATE)
不会删除时间组件,因为在Oracle中没有
DATETIME
数据类型,
DATE
在内部存储为包含年(2字节)和月、日、小时、分钟和秒(各1字节)。所有这一切都将从
时间戳
中删除小数秒。此外,使用
日期
nvarhar2
字符串的比较将导致使用
NLS\u DATE\u FORMAT
会话参数在字符串上隐式调用
to\u DATE
。如果这与字符串的格式不匹配,则查询将引发异常。如果OP的
时间戳
格式似乎是
21-APR-17 02.41.38.520000 PM
,则
日期
格式可能类似,这将失败。
SELECT *
FROM   Temp
WHERE  date_c >= TO_TIMESTAMP( :your_date_string, 'YYYY-MM-DD' ) AND
       date_c <  TO_TIMESTAMP( :your_date_string, 'YYYY-MM-DD' ) + INTERVAL '1' DAY;
SELECT *
FROM Temp t
WHERE CAST(t.CREATED_ON as date)= N'2017-04-22'
ORDER BY t.id