C# 如何从我的数据库中提取YYYYMMDD
我已经阅读了关于如何修复堆栈溢出的大部分链接,但我仍然希望有一些清晰,我正在使用C选择时间戳12/19/2014 2:34:09.808151 PM+03:00,我只想选择YYMMDD 20141214格式的日期。这就是我所拥有的: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
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没有格式。使用字符串字段存储日期本身就是一个严重的问题。带有日期参数的参数化插入查询不需要转换为任何格式