【问题标题】:How to Extract YYYYMMDD from my database如何从我的数据库中提取 YYYYMMDD
【发布时间】:2014-12-19 11:38:50
【问题描述】:

我已经阅读了有关如何解决此问题的堆栈溢出的大部分链接,但我仍然希望了解清楚,我正在使用 C# 选择时间戳 (12/19/2014 2:34:09.808151 PM +03:00),我只想以这种格式 YYYYMMDD (20141214) 选择日期。这就是我所拥有的:

string datepaid = "";

然后我执行查询

String SQL = String.Format("SELECT TRANSACTION_CASH_ID,SOURCE_MSISDN,AMOUNT,REFERENCE_ID, CREATED_TIMESTAMP, STATUS_DESCRIPTION,CASH_INFORMATION,(SELECT FIRST_NAME|| ' ' ||SECOND_NAME||' '||LAST_NAME FROM TAX_ACCOUNT_DATA WHERE AUTHORIZED_MOBILE_NUMBER = SOURCE_MSISDN) AS TAX_PAYER_NAME FROM TRANSACTION_CASH WHERE DEST_MSISDN = '12345678923'");

然后我分配它做一个数据表

foreach (DataRow row in table.Rows)
{
    datepaid = row["CREATED_TIMESTAMP"].ToString();
}

然后记录值。

我的问题是如何获取YYYYMMDD 中的日期,将其分配给字符串datepaid,然后在我的数据表C# 中使用它

【问题讨论】:

  • 你的一天是19。这个14 来自哪里?您的数据库中有12/19/2014 2:34:09.808151 PM +03:00 作为字符串? timestamp 类型可以保持这个值吗?我不这么认为。连datetime类型都抱不动。
  • 打错了,应该是19
  • 从不,我重复 NEVER,使用 String.Format 将参数放入 SQL 查询中。请改用参数化查询。不,没有任何借口可以使用String.Format
  • 其实这里根本不涉及参数,所以不需要String.Format调用
  • 检查我的答案,如果对你有帮助,请告诉我。

标签: c# sql datetime


【解决方案1】:

日期没有格式。 DateTime 值的日期部分由Date property 返回,正如时间部分由TimeOfDay 属性返回。不要尝试将日期转换为字符串,这肯定会导致转换和国际化错误、浪费内存、更复杂等。

一般来说,当有datenumeric 这样的具体类型可用时,您永远不应该使用字符串,因为这会使您面临永远无法完全解决的转换和国际化问题。

您可以像这样从CREATED_TIMESTAMP 列中读取日期:

DateTime datepaid = (row["CREATED_TIMESTAMP"] as DateTime).Date;

要仅从 Oracle 或 MySQL 中的日期时间值中检索日期部分,请将它们转换为 DATE 类型。这种类型没有时间部分,例如:

SELECT CAST(CREATED_TIMESTAMP AS Date) as CREATED_DATE, ...

这在 C# 端映射到 DateTime。

在所有情况下,您都应该将日期转换为字符串用于显示目的,切勿用于计算、比较或传回数据库。混合格式太容易了,最终要么出现异常,要么出现更糟糕的错误数据。例如,想象一下将值 '10/1/2014' 存储在数据库中 - 在英国,该数据库具有 Latin1 排序规则。你会在 10 月 1 日结束,而不是 1 月 10 日。

【讨论】:

    【解决方案2】:

    调用 ToString 时需要格式化数据。

    但是,您需要访问在 DateTime 上定义的 ToString 重载,这里有很多陷阱。

    首先,如果您知道或可以确保您的数据库永远不会返回任何 NULL 标记,即。列类型是DateTime 而不是DateTime?,你可以这样做:

    foreach (DataRow row in table.Rows)
    {
        datepaid = row.Field<DateTime>("CREATED_TIMESTAMP").ToString("yyyyMMdd");
    }
    

    如果可以为NULL:

    foreach (DataRow row in table.Rows)
    {
        DateTime? value = row.Field<DateTime?>("CREATED_TIMESTAMP");
        datepaid = value.HasValue ? value.Value.ToString("yyyyMMdd") : null;
    }
    

    【讨论】:

    • 没有理由转成字符串,DateTime.Date 返回日期部分
    • 但它本身没有格式。当他说格式并显示我假设字符串的格式时。
    【解决方案3】:

    首先始终使用命令参数,这将阻止您进行 SQLInjection,在这种情况下,sql server 可以缓存此查询,这将导致性能优化!

     String sql = @"
    SELECT 
       TRANSACTION_CASH_ID,
       SOURCE_MSISDN,AMOUNT,REFERENCE_ID, 
       CREATED_TIMESTAMP, STATUS_DESCRIPTION,CASH_INFORMATION,
      (SELECT FIRST_NAME|| ' ' ||SECOND_NAME||' '||LAST_NAME FROM TAX_ACCOUNT_DATA WHERE       AUTHORIZED_MOBILE_NUMBER = SOURCE_MSISDN) AS TAX_PAYER_NAME 
    
    FROM 
       TRANSACTION_CASH
    
    WHERE 
       DEST_MSISDN = @Destination";   
    
    
    SqlCommand cmd = new SqlCommand(connectionString, sql);
    cmd.Parameters.AddWithValue(@Destination, "12345678923");
    

    也从来没有写过这样的专栏,它是不可读的。还要构建您的查询,如果您的查询中有错误,那么您当前的结构将无法找到。

    关于您的问题:您永远不应该在DataSet 中格式化您的日期,因为相同的DataSet 可以在两个地方使用两种不同的格式。在这种情况下,您应该使用两个循环来更改日期的格式。这是不好的可用性!

    你应该在你需要的地方(页面,控制任何东西)改变格式。例如,您应该在页面中的某个标签中显示它。

    Label1.Text = Convert.ToDateTime(row["CREATED_TIMESTAMP"]).ToString("yyyyMMdd");
    

    在其他页面可以是:

    Label2.Text = Convert.ToDateTime(row["CREATED_TIMESTAMP"]).ToString("mm/dd/yyyy");
    

    编辑:如果您不确定行 ["CREATED_TIMESTAMP"] 是有效的 DateTime,您应该使用 DateTime.TryParse

    【讨论】:

    • Convert.ToDateTime 是另一件有风险的事情。如果该值不是日期,它将尝试使用当前语言环境的格式解析文本(对于世界上大多数地区来说,这不是 mm/dd/yyyy)。如果是,则相当于转换为 DateTime
    • 日期没有格式。使用字符串字段来存储日期本身就是一个严重的问题。带有日期参数的参数化插入查询不需要转换为任何格式
    【解决方案4】:

    您没有指定您正在使用哪个 RDBMS,但由于使用了 ||对于连接,我将假设 Oracle 或 MySQL。

    如果您不需要在数据表以外的任何地方使用日期,您可以使用 TO_CHAR(created_timestamp,'YYYYMMDD') as created_timestamp 更改查询以正确格式返回数据

    【讨论】:

    • Bot Oracle 和 MySQL 有一个 date 类型。转换成字符串比转换成字符串要好得多
    【解决方案5】:

    除了查询中参数的 cmets 之外,要让 MS SQL(如果您正在使用)将日期时间转换为 YYYYMMDD,您可以使用以下语句:

    SELECT replace(convert(varchar(10),SYSDATETIME(),112) ,'/','')
    

    【讨论】:

    • 投射到日期更容易、更安全,并且不对用户的语言环境做任何假设
    【解决方案6】:

    首先从您的行中提取一个 DateTime 对象。 然后将 DateTime 格式化为字符串

    foreach (DataRow row in table.Rows)
    {
       // prbably some error handling here
       DateTime dt = (DateTime)row["CREATED_TIMESTAMP"];
       datepaid = dt.ToString("yyyyMMdd");
    }
    

    【讨论】:

    • 不用玩字符串,DateTime.Date返回日期部分
    猜你喜欢
    • 2015-07-21
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2010-12-23
    • 2022-10-18
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多