请问:从字符串转换日期和/或时间时,转换失败。怎么修改

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问:从字符串转换日期和/或时间时,转换失败。怎么修改相关的知识,希望对你有一定的参考价值。

“/”应用程序中的服务器错误。

从字符串转换日期和/或时间时,转换失败。

说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 从字符串转换日期和/或时间时,转换失败。

源错误:

执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:

[SqlException (0x80131904): 从字符串转换日期和/或时间时,转换失败。]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +282
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +807
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +5191
System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows) +278
System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more) +285
System.Data.SqlClient.SqlDataReader.Read() +38
System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping) +167
System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) +230
System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) +427
System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +255
System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) +505
System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +151
Bzw.Data.DbHelper.ExecuteDataTable(DbCommand cmd) +395
Bzw.Data.QuerySection`1.ExcuteDataTable(QuerySection`1 query, Boolean all) +463
Bzw.Web.Ascx.Public.Mune.Page_Load(Object sender, EventArgs e) +368
System.Web.UI.Control.OnLoad(EventArgs e) +97
System.Web.UI.Control.LoadRecursive() +154
System.Web.UI.Control.LoadRecursive() +251
System.Web.UI.Control.LoadRecursive() +251
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4746

版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.6.1590.0

1、在打开HBuilderX工具中,新建一个javascript文件,并在文件中定义一个函数dateTurnStr,调用toDateString(),这个方法可以将日期转换成显示星期、月份、日期和年份。

2、将第一步中的方法换成toGMTString()方法,显示GMT标准日期。

3、如果想要显示ISO日期时间格式,可以直接调用toISOString()方法。

4、将日期转换成对应的JSON字符串,可以使用toJSON()方法。

5、如果想要以当地的日期格式显示,可以使用toLocaleDateString方法。

6、如果想要显示当地的日期和时间,可以使用toLocaleString方法。

参考技术A 日期格式化与字符串转换成时间(C#.NET)
yyyy 代表年
MM 代表月(注意这里要用大写)
dd 代表日
HH/hh 代表时(24小时形式/12小时形式)
mm 代表分(这里用小写表示分钟)
ss 代表秒
//======= 日期格式化成指定字符串 =======
DateTime d = DateTime.now;
d.toString("yyyyMMdd HHmmss"); //例如"20070529 094530"字符串格式
d.toString("yyyy-MM-dd HH:mm:ss"); //例如"2007-05-29 09:45:30"字符串格式
d.toString("yyyy年MM月dd日 HH:mm:ss"); //例如"2007年05月29日 09:45:30"字符串格式

//======= 指定字符串转化成日期(DateTime)=====
string str = "20070529094530";
IFormatProvider format = new System.Globalization.CultureInfo("zh-CN");
string TarStr = "yyyyMMddHHmmss"; //注意这里用到HH
DateTime MyDate = DateTime.ParseExact(str, TarStr);
参考技术B 这清晰的错误提示还要问怎么修改么,找到你出错的行,检查字符串格式 参考技术C command.Parameters["@dateTimePicker1"].Value = Convert.ToDateTime(dateTimePicker1.Value);
command.Parameters["@dateTimePicker2"].Value = Convert.ToDateTime(dateTimePicker2.Value);
//这样转换就是对的了!
参考技术D 不知道你是怎么转换的。你这图也没有源代码。
一般来说有那么几种方法:
需要引用
using system.datetime
方法一:
Convert.ToDateTime(string)
string格式有要求,必须是yyyy-MM-dd hh:mm:ss
方法二:
Convert.ToDateTime(string, IFormatProvider)
DateTime dt;
DateTimeFormatInfo dtFormat = new System.GlobalizationDateTimeFormatInfo();
dtFormat.ShortDatePattern = "yyyy/MM/dd";
dt = Convert.ToDateTime("2018/05/07", dtFormat);

方法三:DateTime.ParseExact()
string dateString = "20110526";
DateTime dt = DateTime.ParseExact(dateString, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
或者
DateTime dt = DateTime.ParseExact(dateString, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);

在透视时从字符串转换日期和/或时间时转换失败

我有以下SQL查询:

DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX),
        @OID AS NVARCHAR(MAX) = '(105, 106)',
        @startDate DATETIME = DATETIMEFROMPARTS(2017, 11, 01, 17, 0, 0, 0),
        @endDate DATETIME =  DATETIMEFROMPARTS(2017, 11, 25, 17, 0, 0, 0)

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Point) 
                      FROM Value
                      GROUP BY Point
                      ORDER BY Point
                      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = 'SELECT timestamp,' + @cols + ' from 
         (
            select timestamp, point, valuenumeric
            from value where point in ' + @OID + ' and Timestamp between ' + 
@startDate + ' and ' + @endDate + '
        ) x
        pivot 
        (
            avg(valuenumeric)
            for point in (' + @cols + ')
        ) p '

execute(@query);

但是我收到了这个错误:

Msg 241,Level 16,State 1,Line 16 从字符串转换日期和/或时间时转换失败。

答案

在与datetime连接之前,您需要明确地将varchar强制转换为string

此外,您还需要在datetime参数周围添加两个单引号,以使用单引号括起日期。

为了避免所有这些麻烦,我建议使用参数化sql。

set @query = 'SELECT timestamp,' + @cols + ' from 
         (
            select timestamp, point, valuenumeric
            from value where point in ' + @OID + ' and Timestamp between  
@startDate and @endDate 
        ) x
        pivot 
        (
            avg(valuenumeric)
            for point in (' + @cols + ')
        ) p '

exec sp_executesql @query,N'@startDate datetime, @endDate Datetime',@startDate,@endDate;
另一答案

问题不在于这些行,动态sql部分中的问题,您将datetime数据类型@startdate@enddate附加到字符串。它应该是:

....
Timestamp between ''' + 
CONVERT(NVARCHAR(50), @startDate, 121)+ ''' and ''' + CONVERT(NVARCHAR(50),@endDate, 121) + '''
        ) x
...

您还需要添加更多',以便将查询正确组合为动态SQL查询。


所以你的完整查询将是:

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX),
@OID as NVARCHAR(MAX) = '(105, 106)',
@startDate datetime = convert(datetime,'01-11-2017 6:10:00 PM',105),
 @endDate datetime =  convert(datetime,'30-11-2017 6:10:00 PM',105);

select @cols = STUFF((SELECT ',' + QUOTENAME(Point) 
                from Value
                group by Point
                order by Point
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'');

set @query = 'SELECT timestamp,' + @cols + ' from 
         (
            select timestamp, point, valuenumeric
            from value where point in ' + @OID + ' and Timestamp between ''' + 
CONVERT(NVARCHAR(50), @startDate, 121)+ ''' and ''' + CONVERT(NVARCHAR(50),@endDate, 121) + '''
        ) x
        pivot 
        (
            avg(valuenumeric)
            for point in (' + @cols + ')
        ) p ';


 execute(@query);

以上是关于请问:从字符串转换日期和/或时间时,转换失败。怎么修改的主要内容,如果未能解决你的问题,请参考以下文章

TSQL:从字符串转换日期和/或时间时转换失败

从字符串转换日期和/或时间时 C# 转换失败

仅在更新期间从字符串转换日期和/或时间时转换失败

将 C# 日期时间发送到 SQL Server - 错误“从字符串转换日期和/或时间时转换失败”

从 C# 中的字符串 SQL 转换日期和/或时间时转换失败

从字符串转换日期和/或时间时转换失败 - Visual Studio