format在代码后面或在sql server中的日期

时间:2017-01-22 11:02:54

标签: c# sql-server datetime-format

我正在开发一个网站。我将日期作为用户的输入,并根据输入的日期,我过滤了DB的结果。我面临的问题是代码背后的日期格式(即1/1/2017 12:00:00 AM)与sql server中的列格式不同(即2016-10-08 17:58:12.000)。第一个区别在于sql时间是24小时格式在C#年/月/日期正在使用" /"而在sql年 - 月 - 日期被" - "这就是为什么它没有正确比较。我希望两边都有相同的日期格式。有谁可以帮忙。感谢

修改

protected void searchRecords(DateTime startDate, DateTime finishDate, DateTime startTime, DateTime finishTime, String receiver) {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlCommand command = new SqlCommand("SP_GetRecords", connection);
            command.CommandType = CommandType.StoredProcedure;
            SqlParameter sDate = new SqlParameter("@sDate", SqlDbType.DateTime);
            sDate.Value = startDate;
            sDate.Direction = ParameterDirection.Input;
            command.Parameters.Add(sDate);
            SqlParameter fDate = new SqlParameter("@fDate", SqlDbType.DateTime);
            fDate.Value = finishDate;
            fDate.Direction = ParameterDirection.Input;
            command.Parameters.Add(fDate);
            SqlParameter sTime = new SqlParameter("@sTime", SqlDbType.DateTime );
            sTime.Value = startTime;
            sTime.Direction = ParameterDirection.Input;
            command.Parameters.Add(sTime);
            SqlParameter fTime = new SqlParameter("@fTime", SqlDbType.DateTime);
            fTime.Value = finishTime;
            fTime.Direction = ParameterDirection.Input;
            command.Parameters.Add(fTime);
            SqlParameter rcvr = new SqlParameter("@rcvr", SqlDbType.NVarChar, 50);
            rcvr.Value = receiver;
            rcvr.Direction = ParameterDirection.Input;
            command.Parameters.Add(rcvr);
            SqlDataReader reader;
            try
            {
                connection.Open();

               // String resultMessage = command.Parameters["@sDate"].Value.ToString();

                reader = command.ExecuteReader();

                while (reader.Read())
                {
                    lblreport.Text = reader["username"].ToString();
                }

            }
            catch (SqlException e)
            {
                lblreport.Text = e.Message;
            }
            finally
            {
                connection.Close();

            }

        }

存储过程:

ALTER PROCEDURE [dbo].[SP_GetRecords]
    -- Add the parameters for the stored procedure here
    @sDate dateTime,
    @fDate dateTime,
    @sTime dateTime,
    @fTime dateTime,
    @rcvr nvarchar(50)
AS
BEGIN

declare @sql nvarchar(max);
declare @startDate datetime;
set @startDate = CONVERT(datetime,@sDate);
set @sql ='select * from outbox where 1=1  ';
    if(@sDate is not null)
        set @sql = @sql + 'and acceptedfordeliverytime >= @sDate  '; 
    if(@rcvr is not null)
        set @sql = @sql + ' and receiver=@rcvr';
    Declare @params nvarchar(500)
    SELECT @params ='@sDate DateTime,'+
                    '@fDate DateTime,'+
                    '@sTime DateTime,'+
                    '@fTime DateTime,'+
                    '@rcvr nvarchar(50)'

     exec sp_executesql @sql, @params,@sDate,@fDate,@sTime,@fTime,@rcvr

2 个答案:

答案 0 :(得分:0)

如果使用DateTime类型,则不需要将日期格式化为C#中的格式以将其发送到SQL Server。如果列的类型为datetime,则不需要在SQL Server端进行强制转换。但是,如果您仍然需要格式化它,请按以下方式进行:

var readyForSql = someDate.ToString("yyyy-MM-dd HH:mm:ss.fff");

您可以阅读更多关于日期格式的here

答案 1 :(得分:0)

我猜测acceptedfordeliverytime >= @sDate没有返回任何记录,因为@sDate的时间部分位于acceptedfordeliverytime的时间部分之后。

尝试将午夜作为时间部分传递@sDate,如下所示:

SqlParameter sDate = new SqlParameter("@sDate", SqlDbType.DateTime);
sDate.Value = startDate.Date;
sDate.Direction = ParameterDirection.Input;
command.Parameters.Add(sDate);
不过,可以缩短为

command.Parameters.Add("@sDate", SqlDbType.DateTime).Value = startDate.Date;

并在sql中使用它:

if(@sTime is not null)
    set @sql = @sql + 'and acceptedfordeliverytime >= @sDate and acceptedfordeliverytime < dateadd(day, 1, @sDate) ';