【问题标题】:extract date only from given timestamp in oracle sql仅从oracle sql中的给定时间戳中提取日期
【发布时间】:2013-05-08 06:54:30
【问题描述】:

以下查询:

select cdate from rprt where cdate <= TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002';

返回:2013/04/27-10:06:26:794 存储在表中。

我只想获取日期:27-04-2013,并获取结果日期和 sysdate 之间的天数。

【问题讨论】:

  • SELECT to_date(create_date, 'DD-MM-YYYY') 应该适合你。试试看
  • ERROR at line 1: ORA-01861: literal does not match format string 指向 cdate。
  • 对不起。由于您已经有了日期,因此您需要将其转换为 char。所以试试 to_char(create_date,'DD-MM-YYYY')。它应该为你工作。

标签: sql oracle10g database-administration


【解决方案1】:

使用函数 cast() 将时间戳转换为日期

select to_char(cast(sysdate as date),'DD-MM-YYYY') from dual;

更多关于函数转换的信息 oracle11g http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions016.htm#SQLRF51256

【讨论】:

    【解决方案2】:

    这正是TO_DATE() 的用途:将时间戳转换为日期。

    只需使用TO_DATE(sysdate) 而不是TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS')

    SQLFiddle demo

    更新

    根据您的更新,您的cdate 列不是真正的DATETIMESTAMP 类型,而是VARCHAR2。使用字符串类型来保存日期并不是一个好主意。在日期上搜索、比较和执行所有其他类型的数学运算非常不方便且缓慢

    您应该将您的cdate VARCHAR2 字段转换为真实的TIMESTAMP。假设除您的代码外,该字段没有其他用户,您可以将cdate 转换为时间戳,如下所示:

    BEGIN TRANSACTION;
    -- add new temp field tdate:
    ALTER TABLE mytable ADD tdate TIMESTAMP;
    -- save cdate to tdate while converting it:
    UPDATE mytable SET tdate = to_date(cdate, 'YYYY-MM-DD HH24:MI:SS');
    
    -- you may want to check contents of tdate before next step!!!
    
    -- drop old field
    ALTER TABLE mytable DROP COLUMN cdate;
    -- rename tdate to cdate:
    ALTER TABLE mytable RENAME COLUMN tdate TO cdate;
    COMMIT;
    

    SQLFiddle Demo

    【讨论】:

    • 抛出错误:ERROR at line 1: ORA-01861: literal does not match format string
    • 好吧,SQLFiddle link 适用于sysdate。是什么赋予了?你确定你在这里讲述了整个故事吗?
    • SELECT to_date(cdate,'DD-MM-YYYY') from rprt where cdate &lt;= TO_DATE(sysdate,'DD-MM-YYYY') and ryg='R' and cnum='C002'; 给我那个错误
    • cdate的数据类型是什么?如果是TIMESTAMPDATE,简单的TO_DATE(cdate) 即可。如果是字符串,则必须使用某种格式。但是,您应该简单地将其转换为真正的时间戳
    • 您不能在时间戳数据类型上使用 to_date。
    【解决方案3】:

    在 Oracle 11g 中, 要从时间戳中获取完整日期,请使用 -

    Select TRUNC(timestamp) FROM TABLE_NAME;
    

    要从时间戳中获取年份,请使用 -

    Select EXTRACT(YEAR FROM TRUNC(timestamp)) from TABLE_NAME;
    

    要从时间戳中获取月份,请使用这个-

    Select EXTRACT(MONTH FROM TRUNC(timestamp)) from TABLE_NAME;
    

    要从时间戳中获取日期,请使用 -

    Select EXTRACT(DAY FROM TRUNC(timestamp)) from TABLE_NAME;
    

    【讨论】:

      【解决方案4】:

      试试这种格式:

      SELECT to_char(sysdate,'dd-mm-rrrr') FROM dual
      

      【讨论】:

        【解决方案5】:

        如下所述将时间戳转换为日期,它肯定会工作 -

        select TO_DATE(TO_CHAR(TO_TIMESTAMP ('2015-04-15 18:00:22.000', 'YYYY-MM-DD HH24:MI:SS.FF'),'MM/DD/YYYY HH24:MI:SS'),'MM/DD/YYYY HH24:MI:SS') dt from dual
        

        【讨论】:

          【解决方案6】:

          如果您希望时间戳列中的值作为日期数据类型返回,请使用以下内容:

          select trunc(my_timestamp_column,'dd') as my_date_column from my_table;
          

          【讨论】:

            【解决方案7】:

            这种格式对我有用,对于提到的日期格式,即MM/DD/YYYY

            SELECT to_char(query_date,'MM/DD/YYYY') as query_date 
            FROM QMS_INVOICE_TABLE;
            

            【讨论】:

            • 有了这个,你就没有约会了。你有一个 Varchar2
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-18
            • 1970-01-01
            • 1970-01-01
            • 2012-07-10
            • 1970-01-01
            • 2020-10-05
            相关资源
            最近更新 更多