【问题标题】:in oracle db format of date 04-DEC-20 while displaying in console shows date like 04-09-2020在日期为 04-DEC-20 的 oracle db 格式中,而在控制台中显示的日期显示为 04-09-2020
【发布时间】:2021-03-29 19:13:42
【问题描述】:

我需要获取表中项目的最后修改日期(oracle db)。 以db格式修改日期=04-DEC-20 在控制台中显示时修改日期=04-09-2020

获取修改日期的c#代码

             string connString =DBUtils.GetDBConnection();
      
                        
            OracleConnection conn = new OracleConnection();

            conn.ConnectionString = connString;

            string sql = "select LASTMODIFIED , name from v_vname where name in('hector')";
            OracleCommand cmd = new OracleCommand();


           
                // Set connection for command.
                cmd.Connection = conn;
                cmd.CommandText = sql;
                conn.Open();
        using (DbDataReader reader = cmd.ExecuteReader())
        {
            if (reader.HasRows)
            {

                while (reader.Read())
                {
                    
                    int date = reader.GetOrdinal("LASTMODIFIED"); // 0

                    var LASTmTime = reader.GetValue(0);
                 Console.WriteLine("modifieddate:" + LASTmTime);
                  }
              }
         }

【问题讨论】:

  • 您可能需要检查两件事:TO_CHAR 函数及其格式掩码和/或 NLS 设置。但是,主要的是 - 如果您在 DB 中有日期/时间戳,最好在应用程序中将它们读取为时间,然后仅在输出时相应地格式化它们
  • c# 和 Oracle 都使用相同的 DateTime 格式(一个数字)来存储日期。在 c# 中调试时,您会看到 VS 用于显示日期的默认方法。显示 ToString() 时使用默认方法,因此日期在 Oracle 和 c# 中完全相同,只是以不同的格式显示。
  • LASTMODIFIED 列的数据类型是什么?如果它是 DATE,那么你断言它的格式是 是不正确的。 DATE 数据类型具有一致的内部二进制格式。您看到报告只是日期的字符表示,由隐式或显式使用TO_CHAR()产生。但是,如果 LASTMODIFIED 的数据类型是 not DATE,那么您有一个严重的设计缺陷。日期应始终输入为 DATE 或 TIMESTAMP,更多信息请访问edstevensdba.wordpress.com/2011/04/07/nls_date_format
  • @jdweng 这是不正确的。在 Oracle 中,DATE 数据类型为 stored in a table as 7-bytes,代表世纪、世纪、月、日、小时、分钟和秒。
  • @MT0 :它仍然是一个数字,驱动程序在数据库和网络之间进行转换,这与问题无关。这个问题与显示数字有关。

标签: c# sql oracle datetime


【解决方案1】:

在 Oracle 中,您可以将date 格式化为带有to_char() 的字符串:

select to_char(lastmodified, 'dd-mm-yyyy') as last_modified, name 
from v_vname 
where name = 'hector'

旁注:name in ('hector') 的措辞更简单 name = 'hector'

【讨论】:

    【解决方案2】:

    在 C# 中使用 .ToString("dd-MM-yyyy") 很优雅

    while (reader.Read())
    {
        int date = reader.GetOrdinal("LASTMODIFIED"); // 0
        var LASTmTime = reader.GetValue(0).ToString("dd-MM-yyyy");
        Console.WriteLine("modifieddate:" + LASTmTime);
    }
    

    【讨论】:

      【解决方案3】:

      Oracle 中的DATE 数据类型值是二进制值consisting of 7-bytes(始终是世纪、世纪、月、日、小时、分钟和秒)。

      当您说格式为 DD-MON-RR 时,您所看到的是您使用的用户界面,将二进制值格式化为您(用户)将理解的内容,对于 SQL/Plus(以及 SQL Developer 和其他人)来说将基于NLS_DATE_FORMAT 会话参数,default NLS_DATE_FORMAT value 取决于您在设置数据库时使用的区域。

      您需要做的是根据您的要求输出DATE 的字符串表示形式。您可以在 SQL 中执行此操作并使用 TO_CHAR 格式化字符串:

      SELECT TO_CHAR( LASTMODIFIED, 'DD-MM-YYYY' ) AS last_modified,
             name
      FROM   v_vname
      WHERE  name = 'hector'
      

      could do it in C#:

      DateTime LASTmTime = reader.GetValue(0);
      Console.WriteLine("modifieddate:" + LASTmTime.toString("dd-MM-yyyy"));
      

      【讨论】:

        猜你喜欢
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        • 2020-08-04
        • 1970-01-01
        相关资源
        最近更新 更多