如何用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();  

这不是一种非常直观的方法,但您可以将“下午”和“上午”字符替换为空字符,然后在字符串末尾添加 ampm。现在您可以将其转换为 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=] 上面的方法。