C #을 사용하여 DateTime 형식을 SQL 형식으로


111

C #에서 현재 날짜 시간 형식을 저장하고 쿼리에 yyyy-MM-dd HH:mm:ss사용할 수 있도록 SQL Server 날짜 형식으로 변환 하려고 UPDATE합니다.

이것은 내 첫 번째 코드였습니다.

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");

날짜의 출력은 괜찮지 만 시간은 항상 "12:00:00"이므로 코드를 다음과 같이 변경했습니다.

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.TimeOfDay.ToString("HH:mm:ss");

이 컴파일 오류가 발생했습니다.

FormatException이 처리되지 않았습니다.

그리고 구문 분석이 필요하다고 제안했습니다. 그래서 여기 StackOverflow에서 내 연구에 따라 코드에 이것을 시도했습니다.

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.Parse.TimeOfDay.ToString("HH:mm:ss");

또는

string sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd") + " " + 
myDateTime.tryParse.TimeOfDay.ToString("HH:mm:ss");

그러나 그것은 주어진 문맥에 유효하지 않은 방법이라는 것을 말하고 있습니다. 나는 내 문제에 대한 해결책을 찾으려고 노력했고 지금은 두 시간 동안 갇혀 있었다. 나는 여전히 C #에 익숙하지 않습니다. 제발 도와 주시겠습니까?


DateTime.TryParseExact를 보셨습니까?
Tim


3
매개 변수를 사용하여 업데이트 DateTime하거나 문자열로 저장하는 이유는 무엇입니까? 또한 ToStringDate시간이 항상 저를 함축12:00:00
V4Vendetta

3
유형의 매개 변수와 함께 매개 변수화 된 쿼리 를 사용해야하며 DATETIME, 그러면 문자열 표현에서 앞뒤로이 모든 변환을 피할 수 있습니다!
marc_s

5
다른 사람들이 말했듯이 매개 변수를 사용하고 모든 것을 그대로 유지하는 것이 datetime좋은 시작일 것입니다. 더 좋은 점은 현재 서버를 전달하는 이유 GETDATE()입니다. 서버 측에서 완전히 호출 할 수 있는 함수가 있습니다.
Damien_The_Unbeliever

답변:


219

아래에서 시도

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss.fff");

정말 감사합니다 문자열 sqlFormattedDate = myDateTime.DateTime ... 어떤 이유로 이것이 내가 달성하고 싶은 것입니다.
Ace Caserya

stackoverflow에서 내 검색은 질문에 여러 번 대답했지만이 때문에 저와 같은 초보자는 관련이 없지만 잘못된 참조를 계속 참조합니다. 죄송합니다. 가능한 한 빨리 질문을 종료하겠습니다.
Ace Caserya

1
C # "Sortable"형식도 같은 일을한다고 생각합니다. 따라서 myDateTime.ToString ( "s");
ProVega 2014 년

@ProVega는 똑같이 보이지 않습니다 (.ToString ( 's')에는 날짜와 시간 사이의 공백 대신 T가 있습니다)-그러나 T가 있거나없는 SQL 서버에서 동일하게 구문 분석되었음을 확인할 수 있습니다 ( 나는 2012 년이다). 로깅 날짜 시간 형식으로 's'를 사용하기 시작 했으므로 그것에 대해 생각합니다. 감사합니다!
Ian Grainger

예, 공식 페이지 CAST 및 CONVERT (Transact-SQL)yyyy-MM-dd 에서 시간과 구분 되는 공백이있는 양식에는 "ODBC canonical"이라는 이름을 사용 하고 구분 문자가있는 양식에는 "ISO8601"이라는 이름을 사용합니다. a T. 그러나 예, 두 형식 모두 암시 적으로 (그리고 올바르게) datetime.
Jeppe의 Stig 닐슨

45

표준 datetime 형식 "s"를 사용하면 국제화 호환성 (MM / dd 대 dd / MM)도 보장됩니다.

myDateTime.ToString("s");

=> 2013-12-31T00:00:00

완전한 옵션 : (코드 : 샘플 결과)

d: 6/15/2008 
D: Sunday, June 15, 2008 
f: Sunday, June 15, 2008 9:15 PM 
F: Sunday, June 15, 2008 9:15:07 PM 
g: 6/15/2008 9:15 PM 
G: 6/15/2008 9:15:07 PM 
m: June 15 
o: 2008-06-15T21:15:07.0000000 
R: Sun, 15 Jun 2008 21:15:07 GMT 
s: 2008-06-15T21:15:07 
t: 9:15 PM 
T: 9:15:07 PM 
u: 2008-06-15 21:15:07Z 
U: Monday, June 16, 2008 4:15:07 AM 
y: June, 2008 

'h:mm:ss.ff t': 9:15:07.00 P 
'd MMM yyyy': 15 Jun 2008 
'HH:mm:ss.f': 21:15:07.0 
'dd MMM HH:mm:ss': 15 Jun 21:15:07 
'\Mon\t\h\: M': Month: 6 
'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00

.NET Framework에서 지원 : 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0
참조 : DateTime.ToString메서드


1
이것은 충분히 세분화되지 않았으며 (밀리 초 누락) 날짜순 정렬에 의존하는 쿼리에서 문제를 일으킬 수 있습니다.
reijerh

시간과 분도 가져 오려면 다음 변환을 사용할 수 있습니다. string sqlFormattedDate = YourDate.ToString ( "yyyy-MM-ddTHH : mm : ss", System.Globalization.CultureInfo.InvariantCulture);
netfed

9

정답은 이미 "매개 변수 사용"이 주어졌습니다. 날짜 형식을 지정하고 SQL-Server에 문자열로 전달하면 서버 측에서 날짜가 해석되는 방식에 따라 달라 지므로 오류가 발생할 수 있습니다. 유럽에서는 2012 년 12 월 1 일을 나타 내기 위해 '1.12.2012'라고 쓰지만 다른 국가에서는 1 월 12 일로 취급 될 수 있습니다.

SSMS에서 직접 명령문을 발행 할 때 나는 yyyymmdd매우 일반적인 형식 을 사용합니다 . 지금까지 작업 한 다양한 설치에서 문제가 발생하지 않았습니다.

좀 이상하지만 모든 버전에서 작동하는 드물게 사용되는 또 다른 형식이 있습니다.

select { d '2013-10-01' }

2013 년 10 월 1 일을 반환합니다.

select { ts '2013-10-01 13:45:01' }

10 월 1 일 오후 1:45:01에 반환됩니다.

사용 매개 변수와에 난 강력하게 조언 결코 자체적으로 포맷 된 명령문 조각을 함께 붙여 넣어 자신의 SQL 코드를 포맷 . SQL 주입 및 이상한 오류에 대한 항목입니다 (부동 값 형식 지정은 또 다른 잠재적 문제).


3

이렇게하면 첫 번째 코드가 작동합니다.

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); //Remove myDateTime.Date part 

3

문제는 DateTime현재까지만 잘리는 "Date"속성에 있습니다. 다음과 같이 변환 할 수 있습니다.

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss"); // <- No Date.ToString()!

2

내가 찾고 있던 대답은 다음과 같습니다.

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

나는 또한 당신이 이렇게 할 수 있다는 것을 배웠다.

DateTime myDateTime = DateTime.Now;
string sqlFormattedDate = myDateTime.ToString(myCountryDateFormat);

여기서 myCountryDateFormat은 요구 사항에 따라 변경 사항을 충족하도록 변경할 수 있습니다.

"이 질문은 여기에 이미 답변이있을 수 있습니다."라는 태그는 실제로 질문에 대답하지 않았습니다. 보시다시피 ".Date"를 생략하는 대신 사용했기 때문입니다. .NET의 새로운 프로그래머에게는 매우 혼란 스럽습니다.


2

현재 날짜를 테이블에 저장하고 싶다면

GETDATE ();

또는이 함수를 매개 변수 로 전달

예. 'update tblname set curdate = GETDATE () where colname = 123'


1

문자열을 모두 건너 뛰지 않는 이유 :

SqlDateTime myDateTime = DateTime.Now;

1

귀하의 문제는 현재까지만 Date잘리는 속성에 DateTime있습니다. 다음과 같이 변환 할 수 있습니다.

DateTime myDateTime = DateTime.Now;

string sqlFormattedDate = myDateTime.ToString("yyyy-MM-dd HH:mm:ss");

감사. 내가 찾던 것;) 놀랍게도 마이크로 소프트는 이것을 더 짧게하기 위해 플래그 나 명령을 추가하지 않았다.
Zeek2

0

SQL Server 언어 설정에 관계없이 C #에서 SQL Server로 DateTime을 전달하는 또 다른 솔루션

지역 설정이 날짜를 dd.MM.yyyy (독일 표준 '104')로 표시한다고 가정합니다.

DateTime myDateTime = DateTime.Now;
string sqlServerDate ="CONVERT("date,'"+myDateTime+"',104)"; 

"104"규칙에 따른 매핑을 고려하여 C # datetime 변수를 SQL Server 날짜 유형 변수에 전달합니다. SQL Server 날짜는 yyyy-MM-dd입니다.

국가 별 설정이 DateTime을 다르게 표시하는 경우 SQL Server CONVERT 테이블에서 적절한 일치를 사용하십시오.

규칙에 대한 자세한 내용은 https://www.techonthenet.com/sql_server/functions/convert.php를 참조하십시오.


0

문제는 두 개의 작은 따옴표가 누락 된 것이라고 생각합니다.

이것은 내가 MSSMS에 실행하는 SQL입니다.

WHERE checktime >= '2019-01-24 15:01:36.000' AND checktime <= '2019-01-25 16:01:36.000'

보시다시피 두 개의 작은 따옴표가 있으므로 코드는 다음과 같아야합니다.

string sqlFormattedDate = "'" + myDateTime.Date.ToString("yyyy-MM-dd") + " " + myDateTime.TimeOfDay.ToString("HH:mm:ss") + "'";

MSSQL 또는 MySQL의 모든 문자열에 작은 따옴표를 사용하십시오. 이게 도움이 되길 바란다.


0

기본 제공 SqlDateTime 클래스를 사용하겠습니다.

new SqlDateTime(DateTime.Now).ToSqlString()

그러나 여전히 null 값을 확인해야합니다. 오버플로 예외가 발생합니다.

new SqlDateTime(DateTime.MinValue).ToSqlString()

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.



-1

해당 dateTime으로 테이블을 업데이트하려면 다음 예제와 같이 SQL 문자열을 사용할 수 있습니다.

int fieldId;
DateTime myDateTime = DateTime.Now
string sql = string.Format(@"UPDATE TableName SET DateFieldName='{0}' WHERE FieldID={1}, myDateTime.ToString("yyyy-MM-dd HH:mm:ss"), fieldId.ToString());

2
이 질문은 이미 더 우아한 솔루션으로 답변되고 수용되었습니다. 그리고 당신은 결산을 놓치고 "있습니다.
1

-1
   DateTime date1 = new DateTime();

    date1 = Convert.ToDateTime(TextBox1.Text);
    Label1.Text = (date1.ToLongTimeString()); //11:00 AM
    Label2.Text = date1.ToLongDateString(); //Friday, November 1, 2019;
    Label3.Text = date1.ToString();
    Label4.Text = date1.ToShortDateString();
    Label5.Text = date1.ToShortTimeString();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.