0

次の値の文字列を受け取ります。

0001-01-01T12:30:00

データベースに保存するときは、時間の部分だけが必要です。

しかし、 1900+が必要なため、 MSSQL Server (フィールドはタイプ)0001で年を保存できません。SmallDateTime

現在、年を確認し、次のコードを使用して日付を再作成します。

...
DateTime i = Convert.ToDateTime("0001-01-01T12:30:00");
DateTime d = new DateTime(1900, 1, 1, i.hour, i.minute, i.seconds);

年が 0001 に設定されている日付形式を使用する簡単な方法はありますか?

この値を持つ可能性のある、インポートしているすべてのフィールドがわからないため、すべてのフィールドにこのコードを追加したくありません。

4

3 に答える 3

3

DateTime.Add()このメソッドは、プロパティと組み合わせて使用​​できDateTime.TimeOfDayます。

これが通常の SQL の場合、 SqlDateTime.MinValueヘルパーをdatetime使用して、DateTime を追加できます。

SqlDateTime.MinValue.Value.Add(Convert.ToDateTime("0001-01-01T12:30:00").TimeOfDay)

smalldatetime自分で作成できます。

new DateTime(1900, 1, 1).Add(Convert.ToDateTime("0001-01-01T12:30:00").TimeOfDay)
于 2013-08-28T20:23:47.677 に答える
1

日付コンポーネントを気にしない場合は、次のようにする必要があります。

public static DateTime String2SqlAcceptableDateTimeValue( string iso8601DateTimeValue )
{
  CultureInfo ci = CultureInfo.InvariantCulture ;
  DateTime timestamp ;
  bool converted = DateTime.TryParseExact( iso8601DateTimeValue , "yyyy-MM-ddTHH:mm:ss" , ci ,DateTimeStyles.None, out timestamp ) ;

  if ( !converted ) throw new ArgumentException("Not an ISO 8601 Date/Time value" , "iso8601DateTimeValue");

  DateTime epoch = new DateTime(1900,1,1) ;
  DateTime sqlAcceptableValue = epoch + timestamp.TimeOfDay ;

  return sqlAcceptableValue ;
}

への変換から日付コンポーネントを除外する方が簡単かもしれませんDateTime。これにより、1 ライナー (まあ、2 ライナー) になります。

CultureInfo ci = CultureInfo.InvariantCulture ;
string tod = "0001-01-01T12:34:56".Substring(11) ;
DateTime dtx = new DateTime(1900,1,1) + DateTime.ParseExact(tod,"HH:mm:ss",ci).TimeOfDay ;

これにより、意図がより明確になると思います。

于 2013-08-28T21:05:58.803 に答える
1

時間の部分だけに関心がある場合は、自分が持っているものを実行するのが最善です。SQL Serverの通常のDateTimeデータ型でさえ、カレンダーの問題により 1753 までしか戻りません。

0001 から始まる年を受け入れる本質的に制約のない日付データ型が必要な場合は、DateTime2を使用します。

于 2013-08-28T20:26:35.437 に答える