如何用C#在T-SQL脚本中转换中文单词(下午/上午)的数据格式(基于中文版的SQL服务器)
How To Convert Data Format with Chinese words (下午/上午) In T-SQL Script with C# (based on SQL Server with Chinese Version)
我在 C# 中遇到 SqlCommand
问题,我需要将 DateTime
格式插入 SQL 服务器,如下代码
例如
using (SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=B2CCompareData;Persist Security Info=True;User ID=sa;Password=1111;MultipleActiveResultSets=True;Connection Timeout=600; Application Name=EntityFramework"))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = "Insert into table1(indexid,createTime) values(1,Convert(datetime, '2016/1/20 下午 04:21:07', 121))";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}
2016/1/20 **下午** 04:21:07
==> 中文字混合的日期时间
但不幸的是我收到一条错误消息:
Conversion failed when converting date and/or time from character
string.
那么我该怎么做才能解决这个问题?
PS: 上午
是 AM
/ 下午
是 PM
在保存到数据库之前,您可以将日期时间值转换为标准格式。每当您从 table 检索日期时间时,您只需将其转换为适当的格式,以便使用 Format()
函数进行显示。有关详细信息,请参阅 this link
could you just replace it? replace(replace(column1,'上午','AM'),'下午','PM').
这是根据Stack Overflow post
If you need to convert a string to a DateTime you could try
DateTime dt = DateTime.Parse("01:00 PM"); // No error checking
or (with error checking)
DateTime dt; bool res = DateTime.TryParse("01:00 PM", out dt);
Variable dt contains your datetime, so you can write it
dt.ToString("HH:mm");
Last one works for every DateTime var you have, so if you still have a
DateTime, you can write it out in this way.
获取 24 小时格式的时间并将其存储在数据库中。
希望这个例子可以帮助您解决问题
例如
C#
DateTime dt = DateTime.Now;
string str = dt.ToString("yyyy-MM-dd HH:mm:ss.000");
using (SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=**;Persist Security Info=True;User ID=**;Password=**;MultipleActiveResultSets=True;Connection Timeout=600; Application Name=EntityFramework"))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
try
{
SqlCommand cmd = new SqlCommand(string.Format("INSERT INTO aa(IndexID,ChangeTime) VALUES (1, Convert(datetime, '{0}', 121)))",str ));
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}
)
PS: more format information for you
Server string to date / datetime conversion - datetime string format sql server
-- MSSQL string to datetime conversion - convert char to date - convert varchar to date
-- Subtract 100 from style number (format) for yy instead yyyy (or ccyy with century)
SELECT convert(datetime, 'Oct 23 2012 11:01AM', 100) -- mon dd yyyy hh:mmAM (or PM)
SELECT convert(datetime, 'Oct 23 2012 11:01AM') -- 2012-10-23 11:01:00.000
-- Without century (yy) string date conversion - convert string to datetime function
SELECT convert(datetime, 'Oct 23 12 11:01AM', 0) -- mon dd yy hh:mmAM (or PM)
SELECT convert(datetime, 'Oct 23 12 11:01AM') -- 2012-10-23 11:01:00.000
-- Convert string to datetime sql - convert string to date sql - sql dates format
-- T-SQL convert string to datetime - SQL Server convert string to date
SELECT convert(datetime, '10/23/2016', 101) -- mm/dd/yyyy
SELECT convert(datetime, '2016.10.23', 102) -- yyyy.mm.dd ANSI date with century
SELECT convert(datetime, '23/10/2016', 103) -- dd/mm/yyyy
SELECT convert(datetime, '23.10.2016', 104) -- dd.mm.yyyy
SELECT convert(datetime, '23-10-2016', 105) -- dd-mm-yyyy
-- mon types are nondeterministic conversions, dependent on language setting
SELECT convert(datetime, '23 OCT 2016', 106) -- dd mon yyyy
SELECT convert(datetime, 'Oct 23, 2016', 107) -- mon dd, yyyy
-- 2016-10-23 00:00:00.000
SELECT convert(datetime, '20:10:44', 108) -- hh:mm:ss
-- 1900-01-01 20:10:44.000
-- mon dd yyyy hh:mm:ss:mmmAM (or PM) - sql time format - SQL Server datetime format
SELECT convert(datetime, 'Oct 23 2016 11:02:44:013AM', 109)
-- 2016-10-23 11:02:44.013
SELECT convert(datetime, '10-23-2016', 110) -- mm-dd-yyyy
SELECT convert(datetime, '2016/10/23', 111) -- yyyy/mm/dd
-- YYYYMMDD ISO date format works at any language setting - international standard
SELECT convert(datetime, '20161023')
SELECT convert(datetime, '20161023', 112) -- ISO yyyymmdd
-- 2016-10-23 00:00:00.000
SELECT convert(datetime, '23 Oct 2016 11:02:07:577', 113) -- dd mon yyyy hh:mm:ss:mmm
-- 2016-10-23 11:02:07.577
SELECT convert(datetime, '20:10:25:300', 114) -- hh:mm:ss:mmm(24h)
-- 1900-01-01 20:10:25.300
SELECT convert(datetime, '2016-10-23 20:44:11', 120) -- yyyy-mm-dd hh:mm:ss(24h)
-- 2016-10-23 20:44:11.000
SELECT convert(datetime, '2016-10-23 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm
-- 2016-10-23 20:44:11.500
-- Style 126 is ISO 8601 format: international standard - works with any language setting
SELECT convert(datetime, '2008-10-23T18:52:47.513', 126) -- yyyy-mm-ddThh:mm:ss(.mmm)
-- 2008-10-23 18:52:47.513
SELECT convert(datetime, N'23 شوال 1429 6:52:47:513PM', 130) -- Islamic/Hijri date
SELECT convert(datetime, '23/10/1429 6:52:47:513PM', 131) -- Islamic/Hijri date
-- Convert DDMMYYYY format to datetime - sql server to date / datetime
SELECT convert(datetime, STUFF(STUFF('31012016',3,0,'-'),6,0,'-'), 105)
-- 2016-01-31 00:00:00.000
-- SQL Server T-SQL string to datetime conversion without century - some exceptions
-- nondeterministic means language setting dependent such as Mar/Mär/mars/márc
SELECT convert(datetime, 'Oct 23 16 11:02:44AM') -- Default
SELECT convert(datetime, '10/23/16', 1) -- mm/dd/yy U.S.
SELECT convert(datetime, '16.10.23', 2) -- yy.mm.dd ANSI
SELECT convert(datetime, '23/10/16', 3) -- dd/mm/yy UK/FR
SELECT convert(datetime, '23.10.16', 4) -- dd.mm.yy German
SELECT convert(datetime, '23-10-16', 5) -- dd-mm-yy Italian
SELECT convert(datetime, '23 OCT 16', 6) -- dd mon yy non-det.
SELECT convert(datetime, 'Oct 23, 16', 7) -- mon dd, yy non-det.
SELECT convert(datetime, '20:10:44', 8) -- hh:mm:ss
SELECT convert(datetime, 'Oct 23 16 11:02:44:013AM', 9) -- Default with msec
SELECT convert(datetime, '10-23-16', 10) -- mm-dd-yy U.S.
SELECT convert(datetime, '16/10/23', 11) -- yy/mm/dd Japan
SELECT convert(datetime, '161023', 12) -- yymmdd ISO
SELECT convert(datetime, '23 Oct 16 11:02:07:577', 13) -- dd mon yy hh:mm:ss:mmm EU dflt
SELECT convert(datetime, '20:10:25:300', 14) -- hh:mm:ss:mmm(24h)
SELECT convert(datetime, '2016-10-23 20:44:11',20) -- yyyy-mm-dd hh:mm:ss(24h) ODBC can.
SELECT convert(datetime, '2016-10-23 20:44:11.500', 21)-- yyyy-mm-dd hh:mm:ss.mmm ODBC
------------
-- SQL Datetime Data Type: Combine date & time string into datetime - sql hh mm ss
-- String to datetime - mssql datetime - sql convert date - sql concatenate string
DECLARE @DateTimeValue varchar(32), @DateValue char(8), @TimeValue char(6)
SELECT @DateValue = '20120718',
@TimeValue = '211920'
SELECT @DateTimeValue =
convert(varchar, convert(datetime, @DateValue), 111)
+ ' ' + substring(@TimeValue, 1, 2)
+ ':' + substring(@TimeValue, 3, 2)
+ ':' + substring(@TimeValue, 5, 2)
SELECT
DateInput = @DateValue, TimeInput = @TimeValue,
DateTimeOutput = @DateTimeValue;
/*
DateInput TimeInput DateTimeOutput
20120718 211920 2012/07/18 21:19:20 */
C# 将字符串转换为 DateTime
DateTimeFormatInfo us = new CultureInfo("en-US", false).DateTimeFormat;
DateTimeFormatInfo tw = new CultureInfo("zh-TW", false).DateTimeFormat;
string result = Convert.ToDateTime("12/01/2011 下午 11:00:00 ", tw ).ToString("yyyy/MM/dd HH:mm:ss");
DateTime.ParseExact(result, "MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
cmd.CommandText = "Insert into table1(indexid,createTime) values(1, "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+")";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
这不是一种非常直观的方法,但您可以将“下午”和“上午”字符替换为空字符,然后在字符串末尾添加 am
或 pm
。现在您可以将其转换为 datetime
DECLARE @string NVARCHAR(30) = N'2016/1/20 下午 04:21:07'
SELECT CONVERT(DATETIME, REPLACE(REPLACE(@string, N'下午', ''), N'上午', '') +
CASE WHEN ISNULL(CHARINDEX(N'下', @string), 0) > 0 THEN ' pm'
WHEN ISNULL(CHARINDEX(N'上', @string), 0) > 0 THEN ' am'
END , 121)
输出
2016-01-20 16:21:07.000
第 1 步 - 将日期字符串转换为 DateTime
解决方案的第一部分是解析中文日期字符串。您可以使用 DateTime.Parse()
方法执行此操作:
try
{
string dateTimeString = "2016/1/20 下午 04:21:07";
DateTime createTime = DateTime.Parse(dateTimeString);
}
catch (FormatException e)
{
// The date string wasn't in a format that is recognized
}
如果您 运行 使用的计算机语言设置为中文以外的其他语言,那么您需要明确指定您正在尝试解析中文日期:
var chineseCultureInfo = new CultureInfo("zh-CN");
string dateTimeString = "2016/1/20 下午 04:21:07";
DateTime createTime = DateTime.Parse(dateTimeString, chineseCultureInfo);
步骤 2 - 使用参数化查询将 DateTime 插入 SQL 服务器
现在您有了一个合适的 DateTime 对象,您可以将它插入到 SQL 服务器中。我们使用 参数化查询 来执行此操作,这样我们就不必担心让数据库服务器尝试解析我们的日期字符串。
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "Insert into table1(indexid,createTime) values(1,@createTime))";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@createTime", createTime);
cmd.ExecuteNonQuery();
如果将来某个时候您需要支持另一种语言格式的日期,此解决方案还有一个额外的好处,即只需向 CultureInfo
提供不同的 CultureInfo
=15=] 上面的方法。
我在 C# 中遇到 SqlCommand
问题,我需要将 DateTime
格式插入 SQL 服务器,如下代码
例如
using (SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=B2CCompareData;Persist Security Info=True;User ID=sa;Password=1111;MultipleActiveResultSets=True;Connection Timeout=600; Application Name=EntityFramework"))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
try
{
cmd.CommandText = "Insert into table1(indexid,createTime) values(1,Convert(datetime, '2016/1/20 下午 04:21:07', 121))";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}
2016/1/20 **下午** 04:21:07
==> 中文字混合的日期时间
但不幸的是我收到一条错误消息:
Conversion failed when converting date and/or time from character string.
那么我该怎么做才能解决这个问题?
PS: 上午
是 AM
/ 下午
是 PM
在保存到数据库之前,您可以将日期时间值转换为标准格式。每当您从 table 检索日期时间时,您只需将其转换为适当的格式,以便使用 Format()
函数进行显示。有关详细信息,请参阅 this link
could you just replace it? replace(replace(column1,'上午','AM'),'下午','PM').
这是根据Stack Overflow post
If you need to convert a string to a DateTime you could try
DateTime dt = DateTime.Parse("01:00 PM"); // No error checking
or (with error checking)
DateTime dt; bool res = DateTime.TryParse("01:00 PM", out dt);
Variable dt contains your datetime, so you can write it
dt.ToString("HH:mm");
Last one works for every DateTime var you have, so if you still have a DateTime, you can write it out in this way.
获取 24 小时格式的时间并将其存储在数据库中。
希望这个例子可以帮助您解决问题
例如 C#
DateTime dt = DateTime.Now;
string str = dt.ToString("yyyy-MM-dd HH:mm:ss.000");
using (SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=**;Persist Security Info=True;User ID=**;Password=**;MultipleActiveResultSets=True;Connection Timeout=600; Application Name=EntityFramework"))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
try
{
SqlCommand cmd = new SqlCommand(string.Format("INSERT INTO aa(IndexID,ChangeTime) VALUES (1, Convert(datetime, '{0}', 121)))",str ));
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
catch
{
throw;
}
}
)
PS: more format information for you
Server string to date / datetime conversion - datetime string format sql server
-- MSSQL string to datetime conversion - convert char to date - convert varchar to date
-- Subtract 100 from style number (format) for yy instead yyyy (or ccyy with century)
SELECT convert(datetime, 'Oct 23 2012 11:01AM', 100) -- mon dd yyyy hh:mmAM (or PM)
SELECT convert(datetime, 'Oct 23 2012 11:01AM') -- 2012-10-23 11:01:00.000
-- Without century (yy) string date conversion - convert string to datetime function
SELECT convert(datetime, 'Oct 23 12 11:01AM', 0) -- mon dd yy hh:mmAM (or PM)
SELECT convert(datetime, 'Oct 23 12 11:01AM') -- 2012-10-23 11:01:00.000
-- Convert string to datetime sql - convert string to date sql - sql dates format
-- T-SQL convert string to datetime - SQL Server convert string to date
SELECT convert(datetime, '10/23/2016', 101) -- mm/dd/yyyy
SELECT convert(datetime, '2016.10.23', 102) -- yyyy.mm.dd ANSI date with century
SELECT convert(datetime, '23/10/2016', 103) -- dd/mm/yyyy
SELECT convert(datetime, '23.10.2016', 104) -- dd.mm.yyyy
SELECT convert(datetime, '23-10-2016', 105) -- dd-mm-yyyy
-- mon types are nondeterministic conversions, dependent on language setting
SELECT convert(datetime, '23 OCT 2016', 106) -- dd mon yyyy
SELECT convert(datetime, 'Oct 23, 2016', 107) -- mon dd, yyyy
-- 2016-10-23 00:00:00.000
SELECT convert(datetime, '20:10:44', 108) -- hh:mm:ss
-- 1900-01-01 20:10:44.000
-- mon dd yyyy hh:mm:ss:mmmAM (or PM) - sql time format - SQL Server datetime format
SELECT convert(datetime, 'Oct 23 2016 11:02:44:013AM', 109)
-- 2016-10-23 11:02:44.013
SELECT convert(datetime, '10-23-2016', 110) -- mm-dd-yyyy
SELECT convert(datetime, '2016/10/23', 111) -- yyyy/mm/dd
-- YYYYMMDD ISO date format works at any language setting - international standard
SELECT convert(datetime, '20161023')
SELECT convert(datetime, '20161023', 112) -- ISO yyyymmdd
-- 2016-10-23 00:00:00.000
SELECT convert(datetime, '23 Oct 2016 11:02:07:577', 113) -- dd mon yyyy hh:mm:ss:mmm
-- 2016-10-23 11:02:07.577
SELECT convert(datetime, '20:10:25:300', 114) -- hh:mm:ss:mmm(24h)
-- 1900-01-01 20:10:25.300
SELECT convert(datetime, '2016-10-23 20:44:11', 120) -- yyyy-mm-dd hh:mm:ss(24h)
-- 2016-10-23 20:44:11.000
SELECT convert(datetime, '2016-10-23 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm
-- 2016-10-23 20:44:11.500
-- Style 126 is ISO 8601 format: international standard - works with any language setting
SELECT convert(datetime, '2008-10-23T18:52:47.513', 126) -- yyyy-mm-ddThh:mm:ss(.mmm)
-- 2008-10-23 18:52:47.513
SELECT convert(datetime, N'23 شوال 1429 6:52:47:513PM', 130) -- Islamic/Hijri date
SELECT convert(datetime, '23/10/1429 6:52:47:513PM', 131) -- Islamic/Hijri date
-- Convert DDMMYYYY format to datetime - sql server to date / datetime
SELECT convert(datetime, STUFF(STUFF('31012016',3,0,'-'),6,0,'-'), 105)
-- 2016-01-31 00:00:00.000
-- SQL Server T-SQL string to datetime conversion without century - some exceptions
-- nondeterministic means language setting dependent such as Mar/Mär/mars/márc
SELECT convert(datetime, 'Oct 23 16 11:02:44AM') -- Default
SELECT convert(datetime, '10/23/16', 1) -- mm/dd/yy U.S.
SELECT convert(datetime, '16.10.23', 2) -- yy.mm.dd ANSI
SELECT convert(datetime, '23/10/16', 3) -- dd/mm/yy UK/FR
SELECT convert(datetime, '23.10.16', 4) -- dd.mm.yy German
SELECT convert(datetime, '23-10-16', 5) -- dd-mm-yy Italian
SELECT convert(datetime, '23 OCT 16', 6) -- dd mon yy non-det.
SELECT convert(datetime, 'Oct 23, 16', 7) -- mon dd, yy non-det.
SELECT convert(datetime, '20:10:44', 8) -- hh:mm:ss
SELECT convert(datetime, 'Oct 23 16 11:02:44:013AM', 9) -- Default with msec
SELECT convert(datetime, '10-23-16', 10) -- mm-dd-yy U.S.
SELECT convert(datetime, '16/10/23', 11) -- yy/mm/dd Japan
SELECT convert(datetime, '161023', 12) -- yymmdd ISO
SELECT convert(datetime, '23 Oct 16 11:02:07:577', 13) -- dd mon yy hh:mm:ss:mmm EU dflt
SELECT convert(datetime, '20:10:25:300', 14) -- hh:mm:ss:mmm(24h)
SELECT convert(datetime, '2016-10-23 20:44:11',20) -- yyyy-mm-dd hh:mm:ss(24h) ODBC can.
SELECT convert(datetime, '2016-10-23 20:44:11.500', 21)-- yyyy-mm-dd hh:mm:ss.mmm ODBC
------------
-- SQL Datetime Data Type: Combine date & time string into datetime - sql hh mm ss
-- String to datetime - mssql datetime - sql convert date - sql concatenate string
DECLARE @DateTimeValue varchar(32), @DateValue char(8), @TimeValue char(6)
SELECT @DateValue = '20120718',
@TimeValue = '211920'
SELECT @DateTimeValue =
convert(varchar, convert(datetime, @DateValue), 111)
+ ' ' + substring(@TimeValue, 1, 2)
+ ':' + substring(@TimeValue, 3, 2)
+ ':' + substring(@TimeValue, 5, 2)
SELECT
DateInput = @DateValue, TimeInput = @TimeValue,
DateTimeOutput = @DateTimeValue;
/*
DateInput TimeInput DateTimeOutput
20120718 211920 2012/07/18 21:19:20 */
C# 将字符串转换为 DateTime
DateTimeFormatInfo us = new CultureInfo("en-US", false).DateTimeFormat;
DateTimeFormatInfo tw = new CultureInfo("zh-TW", false).DateTimeFormat;
string result = Convert.ToDateTime("12/01/2011 下午 11:00:00 ", tw ).ToString("yyyy/MM/dd HH:mm:ss");
DateTime.ParseExact(result, "MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
cmd.CommandText = "Insert into table1(indexid,createTime) values(1, "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+")";
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
这不是一种非常直观的方法,但您可以将“下午”和“上午”字符替换为空字符,然后在字符串末尾添加 am
或 pm
。现在您可以将其转换为 datetime
DECLARE @string NVARCHAR(30) = N'2016/1/20 下午 04:21:07'
SELECT CONVERT(DATETIME, REPLACE(REPLACE(@string, N'下午', ''), N'上午', '') +
CASE WHEN ISNULL(CHARINDEX(N'下', @string), 0) > 0 THEN ' pm'
WHEN ISNULL(CHARINDEX(N'上', @string), 0) > 0 THEN ' am'
END , 121)
输出
2016-01-20 16:21:07.000
第 1 步 - 将日期字符串转换为 DateTime
解决方案的第一部分是解析中文日期字符串。您可以使用 DateTime.Parse()
方法执行此操作:
try
{
string dateTimeString = "2016/1/20 下午 04:21:07";
DateTime createTime = DateTime.Parse(dateTimeString);
}
catch (FormatException e)
{
// The date string wasn't in a format that is recognized
}
如果您 运行 使用的计算机语言设置为中文以外的其他语言,那么您需要明确指定您正在尝试解析中文日期:
var chineseCultureInfo = new CultureInfo("zh-CN");
string dateTimeString = "2016/1/20 下午 04:21:07";
DateTime createTime = DateTime.Parse(dateTimeString, chineseCultureInfo);
步骤 2 - 使用参数化查询将 DateTime 插入 SQL 服务器
现在您有了一个合适的 DateTime 对象,您可以将它插入到 SQL 服务器中。我们使用 参数化查询 来执行此操作,这样我们就不必担心让数据库服务器尝试解析我们的日期字符串。
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "Insert into table1(indexid,createTime) values(1,@createTime))";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@createTime", createTime);
cmd.ExecuteNonQuery();
如果将来某个时候您需要支持另一种语言格式的日期,此解决方案还有一个额外的好处,即只需向 CultureInfo
提供不同的 CultureInfo
=15=] 上面的方法。