如何从我的数据库中提取YYYYMMDD

时间:2014-12-19 11:38:51

标签: c# sql datetime

我已经阅读了关于如何修复此问题的堆栈溢出的大部分链接,但我仍然希望有一些清晰度,我使用C#来选择时间戳(2014年12月19日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#

中使用它

6 个答案:

答案 0 :(得分:2)

日期没有格式。正如Date property属性返回时间部分一样,TimeOfDay返回DateTime值的日期部分。不要试图将日期转换为字符串,这是进入转换和国际化错误,浪费内存,更复杂等的可靠方法。

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

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

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

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

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

这将映射到C#端的DateTime。

在所有情况下,您应该将日期转换为字符串以用于显示目的,绝不会将其转换为计算,比较或传回数据库。它很容易混淆格式,最终会导致异常或更糟糕的数据。想象一下,例如将值'10 / 1/2014'存储在数据库中 - 在英国,具有Latin1校对。你最终会在10月1日结束,而不是1月10日。

答案 1 :(得分:1)

调用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;
}

答案 2 :(得分:1)

首先总是使用命令参数,这将阻止您使用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可以在两个地方使用2种不同的格式。在这种情况下,您应该使用两个循环来更改日期的格式。这是糟糕的可用性!

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

除了查询中的参数注释之外,要获取MS SQL(如果这是您正在使用的)将datetime转换为YYYYMMDD,您可以使用以下语句:

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

答案 5 :(得分:0)

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

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