Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
Sql 如何在oracle中比较日期和时间_Sql_Oracle - Fatal编程技术网

Sql 如何在oracle中比较日期和时间

Sql 如何在oracle中比较日期和时间,sql,oracle,Sql,Oracle,试图用时间来比较两个日期。但是比较不起作用 挑选* 出席人数 截止日期检查时间,'DD/MM/YYYY HH:MI:SS AM'>= 截止日期'2019年9月1日04:30:00 PM','DD/MM/YYYY HH:MI:SS AM' 到日期检查时间,'DD/MM/YYYY HH:MI:SS AM'您可以通过使用包含到时间戳转换的格式来修复格式 SELECT * FROM attendance WHERE checktime BETWEEN TO_TIMESTAMP('0

试图用时间来比较两个日期。但是比较不起作用

挑选* 出席人数 截止日期检查时间,'DD/MM/YYYY HH:MI:SS AM'>= 截止日期'2019年9月1日04:30:00 PM','DD/MM/YYYY HH:MI:SS AM'
到日期检查时间,'DD/MM/YYYY HH:MI:SS AM'您可以通过使用包含到时间戳转换的格式来修复格式

SELECT *
  FROM attendance
 WHERE checktime 
       BETWEEN TO_TIMESTAMP('01/09/2019 16:30:00.000000','dd/mm/yyyy hh24:mi:ss.ff')
           AND TO_TIMESTAMP('30/09/2019 22:30:00.000000','dd/mm/yyyy hh24:mi:ss.ff')
   AND userid = 3825
 ORDER BY checktime;
编辑:您最好添加一个带有时间戳数据类型的新列,并使用to_时间戳转换更新新列的数据,如下所示:

UPDATE attendance
   SET checktime2 = TO_TIMESTAMP('3/09/2019 5:38:36 PM','dd/mm/yyyy hh:mi:ss AM')  
 WHERE id = 3825
   AND checktime = '3/09/2019 5:38:36 PM' 

我认为您需要2019年9月01日至2019年9月30日的所有数据,一天的时间应在下午4:30至10:00之间

您可以使用以下查询来实现这一点:

SELECT
    *
FROM
    ATTENDANCE
WHERE
    TRUNC(TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM'))
        BETWEEN TO_DATE('01/09/2019', 'DD/MM/YYYY') 
        AND TO_DATE('30/09/2019', 'DD/MM/YYYY')
    AND ( TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM') - TRUNC(TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM')) ) * 1440  -- converting difference into minutes
        BETWEEN 990 -- 04:30 PM in minutes (16.5*60)
        AND 1320 -- 10:00 PM in minutes (22*60)
    AND USERID = '3825'
    AND SUBSTR(CHECKTIME, - 2, 2) = 'PM'
ORDER BY
    TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM') ASC;

干杯

列checktime是日期数据类型还是varchar2?checktime是varchar2数据类型,这就是我在执行转换之前转换它的原因,checktime的格式是5/07/2019 8:32:38 am。我的checktime的格式是5/07/2019 8:32:38 am。因此,当我从考勤中简单地运行此select TO_DATECHECKTIME“DD/MM/YYYY”时,我出现以下错误ORA-01830:日期格式图片在转换整个输入字符串之前结束。由于CHECKTIMEFORMAT,您的解决方案不起作用。请根据您的检查时间数据调整格式。这是问题中提到的DD/MM/YY HH:MI:SS AM的解决方案。从出席地点选择*日期检查时间,'DD/MM/YYYY HH:MI:SS AM',从日期2019年9月1日,'DD/MM/YYYY'到日期2019年9月30日,'DD/MM/YYYY'到日期检查时间,'DD/MM/YYYYYY HH:MI:SS AM'-到日期检查时间,“DD/MM/yyyyy HH:MI:SS AM”*1440-将990-04:30 pmin 16.5*60和1320-10:00 pmin 22*60之间的差值转换为分钟,USERID='3825'和SUBSTRCHECKTIME,-2,2='PM'ORDER BY TO_DATECHECKTIME,“DD/MM/YYYY HH:MI:SS AM”在上面的注释中,您可以看到我已经按照我的格式对其进行了格式化,但是由于“`` to_DATECHECKTIME,`”的原因,它没有返回任何内容,“DD/MM/YYYY HH:MI:SS AM”*1440此校验时间也已格式化。@Barbaris当我尝试您提供的解决方案时,出现以下错误ORA-01843:由于校验时间为2019年7月5日8:32:38 AM格式且在db中其数据类型为varchar2,因此不是有效的月份。在字符串类型列中保存日期类型数据是一个问题@ShahidAmin3/09/2019 5:38:36 PM 4/09/2019 5:12:02 PM 6/09/2019 3:05:01 PM 13/09/2019 5:04:43 PM 16/09/2019 5:00:51 PM 17/09/2019 5:05:45 PM 19/09/2019 5:03:57 PM 20/09/2019 5:09:02 PM 23/09 5:04:46 PM 24/09/2019 5:00:09 PM 25/09/2019 5:00:20 PM 26/09/2019 5:04:01 30/09/2019 6:35:20这是我选择运行检查时间时的输出从attendanceexcuse me@ShahidAmin,问题与ORDER BY子句中的checktime有关。这不应该格式化。我修正了。我的格式不同。我的格式是2019年7月5日上午8:32:38,您使用的格式是2019年9月1日下午16:30:00.000000