在代码后面或 sql 服务器中格式化日期
format Date in code behind or in sql server
我正在开发一个网站。我将日期作为用户的输入,并根据输入的日期过滤数据库中的结果。我面临的问题是代码后面的日期格式(即 1/1/2017 12:00:00 AM)与 sql 服务器中的列格式不同(即 2016-10-08 [=23= .000).第一个区别是 sql 时间是 24 小时格式 第二个是在 c# year/month/date 中使用“/”分隔,而在 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
如果您使用 DateTime
类型,则无需将日期格式化为 C# 格式即可将其发送到 SQL 服务器。如果该列的类型为 datetime
,则您不需要在 SQL 服务器端强制转换。但是,如果您出于某种原因仍然需要对其进行格式化,方法如下:
var readyForSql = someDate.ToString("yyyy-MM-dd HH:mm:ss.fff");
您可以阅读更多here关于日期格式的内容。
我猜 acceptedfordeliverytime >= @sDate
returns 没有记录,可能是因为 @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) ';
我正在开发一个网站。我将日期作为用户的输入,并根据输入的日期过滤数据库中的结果。我面临的问题是代码后面的日期格式(即 1/1/2017 12:00:00 AM)与 sql 服务器中的列格式不同(即 2016-10-08 [=23= .000).第一个区别是 sql 时间是 24 小时格式 第二个是在 c# year/month/date 中使用“/”分隔,而在 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
如果您使用 DateTime
类型,则无需将日期格式化为 C# 格式即可将其发送到 SQL 服务器。如果该列的类型为 datetime
,则您不需要在 SQL 服务器端强制转换。但是,如果您出于某种原因仍然需要对其进行格式化,方法如下:
var readyForSql = someDate.ToString("yyyy-MM-dd HH:mm:ss.fff");
您可以阅读更多here关于日期格式的内容。
我猜 acceptedfordeliverytime >= @sDate
returns 没有记录,可能是因为 @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) ';