我已经阅读了关于如何修复此问题的堆栈溢出的大部分链接,但我仍然希望有一些清晰度,我使用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#
答案 0 :(得分:2)
日期没有格式。正如Date property属性返回时间部分一样,TimeOfDay返回DateTime值的日期部分。不要试图将日期转换为字符串,这是进入转换和国际化错误,浪费内存,更复杂等的可靠方法。
一般情况下,当有date
或numeric
等具体类型可用时,您永远不应该使用字符串,因为这会让您面临无法完全解决的转换和国际化问题。
您可以从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");
}