在C#中更改DateTime变量的格式,而不是字符串输出

时间:2012-11-14 15:09:51

标签: c# asp.net datetime stored-procedures datetime-format

如何将C#DateTime变量的格式从d/M/yyyy HH:mm:ss转换为yyyy/M/d HH:mm:ss
我不想更改字符串输出,而是更改DateTime变量本身。

我在datetime中有一个带参数@date的存储过程。 现在我尝试将C#中的DateTime变量Today传递给此存储过程。 C#DateTime变量的格式为d/M/yyyy HH:mm:ss,但存储过程需要格式yyyy/M/d HH:mm:ss

我尝试使用LINQ to SQL: 代码:

public static object SP_SelectSalesPriceItem()
{
    var query = dc.SP_SalesPrice(DateTime.Now);
    return query;
}

存储过程:

ALTER PROCEDURE [dbo].[SP_SalesPrice]
    @Date datetime
AS
BEGIN
    SET NOCOUNT ON;


    select SalesPrice.[Item No_]
    from Sales Price 
    where [Starting Date] < @Date and ([Ending Date] > @Date 

这是我在asp.net中遇到的错误: 指定演员无效。

  

堆栈追踪:

     

[InvalidCastException:指定的演员表无效。]
  System.Data.SqlClient.SqlBuffer.get_Int32()+ 5002837
  System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i)+38
  Read_SP_SalesPriceResult(ObjectMaterializer 1 ) +1477
System.Data.Linq.SqlClient.ObjectReader
2.MoveNext()+32
  System.Web.UI.WebControls.ListView.CreateItemsWithoutGroups(ListViewPagedDataSource   dataSource,Boolean dataBinding,InsertItemPosition insertPosition,   ArrayList keyArray)+222
  System.Web.UI.WebControls.ListView.CreateChildControls(IEnumerable的   dataSource,Boolean dataBinding)+1040
  System.Web.UI.WebControls.ListView.PerformDataBinding(IEnumerable的   数据)+44
  System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable的   数据)+128
  System.Web.UI.DataSourceView.Select(DataSourceSelectArguments   参数,DataSourceViewSelectCallback回调)+33
  System.Web.UI.WebControls.DataBoundControl.PerformSelect()+ 143 3   System.Web.UI.WebControls.ListView.PerformSelect()+ 113 3   System.Web.UI.WebControls.BaseDataBoundControl.DataBind()+74
  System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound()+66
  System.Web.UI.WebControls.ListView.CreateChildControls()+55
  System.Web.UI.Control.EnsureChildControls()+ 0102   System.Web.UI.Control.PreRenderRecursiveInternal()+42
  System.Web.UI.Control.PreRenderRecursiveInternal()+ 1755   System.Web.UI.Control.PreRenderRecursiveInternal()+ 1755   System.Web.UI.Control.PreRenderRecursiveInternal()+ 1755   System.Web.UI.Control.PreRenderRecursiveInternal()+ 1755   System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)   2496

3 个答案:

答案 0 :(得分:4)

由于DateTime 没有格式的简单原因,您无法提出要求。

格式是DateTime字符串表示。

存储过程应该为DATETIME采用@date参数 - 如果不是,则表示您做错了。

如果您使用的是NVARCHAR或此类型,则需要在添加参数值之前使用正确的格式在C#中的ToString上调用DateTime

答案 1 :(得分:1)

你不能 - 存储DateTime的方式的内部不是可以改变的东西。实际上它只是给定日期以来的“滴答”数量。

  

时间值以称为刻度线的100纳秒单位测量,特定日期是格里高利历日历中自公元0001年1月1日午夜12:00起的刻度数(不包括将添加的刻度)闰秒)。例如,刻度值31241376000000000L表示日期,星期五,1月1日,0100 12:00:00午夜。

如果您必须将其作为字符串而不是datetime传递,则应将其转换为ToString("yyyy/M/d HH:mm:ss")并将其传递给您的参数。根据您在问题中所说的内容,只有默认的ToString()格式,这几乎可以肯定是内部正在发生的事情。

答案 2 :(得分:1)

正如其他人所说,DateTime没有“格式”,无论是在.NET还是在T-SQL中。 DateTime是一种强类型日期和时间的.NET类型。

无论您正在做什么,请确保日期的存储过程参数是T-SQL类型datetime(或其中一个朋友),而不是varchar或类似。