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

C# 如何从我的数据库中提取YYYYMMDD,c#,sql,datetime,C#,Sql,Datetime,我已经阅读了关于如何修复堆栈溢出的大部分链接,但我仍然希望有一些清晰,我正在使用C选择时间戳12/19/2014 2:34:09.808151 PM+03:00,我只想选择YYMMDD 20141214格式的日期。这就是我所拥有的: string datepaid = ""; 然后我执行查询 String SQL = String.Format("SELECT TRANSACTION_CASH_ID,SOURCE_MSISDN,AMOUNT,REFERENCE_ID, CREATED_TIME

我已经阅读了关于如何修复堆栈溢出的大部分链接,但我仍然希望有一些清晰,我正在使用C选择时间戳12/19/2014 2:34:09.808151 PM+03:00,我只想选择YYMMDD 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中使用它。您没有指定要使用的RDBMS,但由于使用了| |进行连接,我将假定使用Oracle或MySQL


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

,除了查询中有关参数的注释之外,要获取MS SQL,如果您正在使用MS SQL将日期时间转换为YYYYMMDD,则可以使用以下语句:

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

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

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

调用ToString时需要格式化数据

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

首先,如果您知道或能够确保从不从数据库返回任何空标记,即列类型为DateTime而不是DateTime?,则可以执行以下操作:

foreach (DataRow row in table.Rows)
{
    datepaid = row.Field<DateTime>("CREATED_TIMESTAMP").ToString("yyyyMMdd");
}
如果可以为空:

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

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

一般来说,当存在诸如日期或数字之类的具体类型时,您不应该使用字符串,因为这会使您面临无法完全解决的转换和国际化问题

您可以从创建的时间戳列中读取日期,如下所示:

DateTime datepaid = (row["CREATED_TIMESTAMP"] as DateTime).Date;
要仅从Oracle或MySQL中的datetime值中检索日期部分,请将其强制转换为日期类型。此类型没有时间段,例如:

SELECT CAST(CREATED_TIMESTAMP AS Date) as CREATED_DATE, ...
这被映射到C端的DateTime


在所有情况下,您都应该将日期转换为字符串,仅用于显示目的,而不用于计算、比较或传回数据库。它太容易混淆格式,最终会出现异常或更糟糕的坏数据。例如,想象一下将值“10/1/2014”存储在一个数据库中——在英国,该数据库具有拉丁文排序规则。您将在10月1日结束,而不是1月10日。

首先始终使用命令参数这将阻止您进行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");
也永远不要写这样的专栏,它是不可读的。此外,还要构造查询,如果查询中有bug,则无法使用当前结构找到

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

您应该更改placePage中的格式,控制需要它的任何位置。例如,您应该在页面的某个标签中显示它

Label1.Text = Convert.ToDateTime(row["CREATED_TIMESTAMP"]).ToString("yyyyMMdd");
在其他页面中,可以是:

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

编辑:如果您不确定[创建的时间戳]行是否为有效的日期时间,则应使用DateTime.TryParse。

您的日期部分为19。这14是从哪里来的?您的数据库中有12/19/2014 2:34:09.808151 PM+03:00作为字符串吗?时间戳类型可以保存此值吗?我不这么认为。即使datetime类型也不能保存它。这是一个错误,它应该是19Never,我重复一遍NEVER,使用String.Format将参数放入SQL查询中。改用参数化查询。不,使用String.Format完全没有任何借口。实际上,这里根本不涉及参数,所以String.Format调用不需要检查我的答案,并告诉我是否有帮助。没有理由转换为字符串,DateTime.Date返回日期部分,但它本身没有格式。当他说format并显示我假设的字符串格式时,转换为date更容易、更安全,并且不会对用户的localeBot进行任何假设,Oracle和MySQL都有日期类型。转换为字符串要比转换为字符串好得多无需使用字符串DateTime.Date返回日期部分convert.ToDateTime是另一件有风险的事情。如果该值不是日期,它将尝试使用当前区域设置的格式解析文本,而对于世界上大多数地方,该格式不是mm/dd/yyyy。如果是,则相当于转换为DateTimeDates没有格式。使用字符串字段存储日期本身就是一个严重的问题。带有日期参数的参数化插入查询不需要转换为任何格式