163

datetime以下のSQLクエリを使用してテーブル(SQL Server)に値を挿入したい

insert into table1(approvaldate)values(18-06-12 10:34:09 AM);

しかし、私はこのエラーメッセージを受け取ります。Incorrect syntax near '10'.

引用符で試してみました

insert into table1(approvaldate)values('18-06-12 10:34:09 AM');

このエラーメッセージが表示されますCannot convert varchar to datetime

親切に助けてください!ありがとう。

4

7 に答える 7

275

SQL Serverでの明確な日付決定には、YYYYMMDDを使用することをお勧めします。

insert into table1(approvaldate)values('20120618 10:34:09 AM');

あなたがそのdd-mm-yy hh:mm:ss xmフォーマットと結婚しているなら、あなたは特定のスタイルでCONVERTを使う必要があるでしょう。

insert into table1 (approvaldate)
       values (convert(datetime,'18-06-12 10:34:09 PM',5));

5これがイタリアの日付のスタイルです。ええと、イタリア人だけでなく、それがBooksOnlineの文化です

于 2012-10-18T14:59:45.827 に答える
34

文字列リテラルの言語に依存しない選択肢は、国際標準のISO 8601形式「YYYY-MM-DDThh:mm:ss」です。以下のSQLクエリを使用して形式をテストしましたが、 sys.syslanguagesのすべてのSQL言語で実際に機能します。

declare @sql nvarchar(4000)

declare @LangID smallint
declare @Alias sysname

declare @MaxLangID smallint
select @MaxLangID = max(langid) from sys.syslanguages

set @LangID = 0

while @LangID <= @MaxLangID
begin

    select @Alias = alias
    from sys.syslanguages
    where langid = @LangID

    if @Alias is not null
    begin

        begin try
            set @sql = N'declare @TestLang table (langdate datetime)
    set language ''' + @alias + N''';
    insert into @TestLang (langdate)
    values (''2012-06-18T10:34:09'')'
            print 'Testing ' + @Alias

            exec sp_executesql @sql
        end try
        begin catch
            print 'Error in language ' + @Alias
            print ERROR_MESSAGE()
        end catch
    end

    select @LangID = min(langid)
    from sys.syslanguages
    where langid > @LangID
end

Microsoft TechNetの文字列リテラルの日付と時刻の形式のセクションによると、標準のANSI標準SQLの日付形式「YYYY-MM-DDhh:mm:ss」は「多言語」であると想定されています。ただし、同じクエリを使用すると、ANSI形式がすべてのSQL言語で機能するわけではありません。

たとえば、デンマーク語では、次のような多くのエラーが発生します。

デンマーク語のエラーvarcharデータ型を日時データ型に変換すると、値が範囲外になりました。

SQL Serverで実行するクエリをC#で作成し、ISO 8601形式で日付を渡す必要がある場合は、並べ替え可能な「s」形式指定子を使用します。

string.Format("select convert(datetime2, '{0:s}'", DateTime.Now);
于 2012-10-18T15:02:47.317 に答える
24

Management Studioは、次のようなスクリプトを作成します。

insert table1 (foodate) values(CAST(N'2012-06-18 10:34:09.000' AS DateTime))
于 2015-06-10T16:57:01.840 に答える
11

あなたはそれを次のように追加する必要があります

insert into table1(date1) values('12-mar-2013');
于 2013-10-24T06:12:58.087 に答える
3

変換を使用する必要はありません。ISO8601形式で引用日としてリストするだけです。
そのようです:

select * from table1 where somedate between '2000/01/01' and '2099/12/31'

区切り文字はa/である必要があり、一重引用符で囲む必要があり'ます。

于 2016-02-28T17:45:52.243 に答える
2

プログラミング言語を介して値を格納している場合

これがC#の例です

日付を保存するには、最初に変換してから保存する必要があります

insert table1 (foodate)
   values (FooDate.ToString("MM/dd/yyyy"));

FooDateは、日付を形式で含む日時変数です。

于 2013-09-28T09:02:13.943 に答える
1

私はより一般的な問題に遭遇します:異なる(そして必ずしも知られていない)日時形式を取得し、それらを日時列に挿入します。私はこのステートメントを使用してそれを解決しました。これは最終的にスカラー関数になりました(ODBCカノニカル、アメリカン、ANSI、およびブリティッシュ\フランチの日付スタイルに関連-拡張可能):

insert into <tableName>(<dateTime column>) values(coalesce 
(TRY_CONVERT(datetime, <DateString, 121), TRY_CONVERT(datetime, <DateString>, 
101), TRY_CONVERT(datetime, <DateString>, 102), TRY_CONVERT(datetime, 
<DateString>, 103))) 
于 2017-11-12T14:21:02.290 に答える