Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MS SQL Server在插入第二行而不是第一行时出错?_Sql_Sql Server_Datetime - Fatal编程技术网

为什么MS SQL Server在插入第二行而不是第一行时出错?

为什么MS SQL Server在插入第二行而不是第一行时出错?,sql,sql-server,datetime,Sql,Sql Server,Datetime,我有一个SQL表,可以让我插入一些带有datetime字段的行,但不是所有的行,我看不出为什么不能。我得到的错误是 '将varchar数据类型转换为datetime数据类型导致值超出范围。' 为了解决这个问题,我创建了一个带有1列的临时表,并尝试添加导致问题的两个日期时间 创建表DateTimeTest创建的datetime 然后我尝试插入这两行 insert into dbo.#DateTimeTest (created) VALUES ('2020-06-12 05:46:00.00');

我有一个SQL表,可以让我插入一些带有datetime字段的行,但不是所有的行,我看不出为什么不能。我得到的错误是

'将varchar数据类型转换为datetime数据类型导致值超出范围。'

为了解决这个问题,我创建了一个带有1列的临时表,并尝试添加导致问题的两个日期时间

创建表DateTimeTest创建的datetime

然后我尝试插入这两行

insert into dbo.#DateTimeTest (created) VALUES ('2020-06-12 05:46:00.00');
insert into dbo.#DateTimeTest (created) VALUES ('2020-06-19 05:31:00.00');
第一行插入时没有任何问题,第二行有错误,但我不明白为什么

(1 row affected)
Msg 242, Level 16, State 3, Line 10
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.

Completion time: 2020-07-15T11:28:43.6451779+01:00
insert into dbo.#DateTimeTest (created) VALUES ('2020-06-19 05:31:00.00');

显然,您的日期格式是YDM而不是YMD。你可以用几种方法解决这个问题

一种方法是使用明确的日期/时间格式。在您的情况下,这将包括一个T:

之所以这样做,是因为YYYY-MM-DDTHH:MI:SS格式是SQL Server中日期/时间格式的标准格式—明确无误且不受日期格式的影响。类似地,YYYYMMDD注意:没有连字符是SQL Server中日期常量的标准、明确的格式,但YYYY-MM-DD受日期格式的约束

第二种方法是将dateformat设置为YMD:

这是一个很好的例子


第三种方法是从字符串中显式提取日期时间,使用诸如convert之类的函数,也许还需要一些字符串操作。

显然,日期格式是YDM而不是YMD。你可以用几种方法解决这个问题

一种方法是使用明确的日期/时间格式。在您的情况下,这将包括一个T:

之所以这样做,是因为YYYY-MM-DDTHH:MI:SS格式是SQL Server中日期/时间格式的标准格式—明确无误且不受日期格式的影响。类似地,YYYYMMDD注意:没有连字符是SQL Server中日期常量的标准、明确的格式,但YYYY-MM-DD受日期格式的约束

第二种方法是将dateformat设置为YMD:

这是一个很好的例子


第三种方法是从字符串中显式提取日期时间,使用诸如convert之类的函数,也可能使用一些字符串操作。

yyyy-MM-dd hh:MM:ss.nnnnn在SQL Server中不是明确的格式。对于旧的日期和时间数据类型(如datetime),根据登录语言的不同,读取方式也不同。例如,奇怪的是,SQL Server会将值“2020-06-19 05:31:00.00”解释为19个月的第6天,因为你根本不是美国人。对于较新的日期和类型数据类型,情况并非如此。因此,在处理文字字符串时,最好使用yyyy-MM-ddThh:MM:ss.NNNNN或yyyyMMdd。yyyy-MM-dd hh:MM:ss.NNNNN在SQL Server中不是明确的格式。对于旧的日期和时间数据类型(如datetime),根据登录语言的不同,读取方式也不同。例如,奇怪的是,SQL Server会将值“2020-06-19 05:31:00.00”解释为19个月的第6天,因为你根本不是美国人。对于较新的日期和类型数据类型,情况并非如此。因此,在处理文字字符串时,最好使用yyyy-MM-ddThh:MM:ss.nnnnnnn或yyyyymmdd。请问为什么我的日期格式会设置为YDM?这是我可以更改的设置吗?@JGee-默认设置取决于您登录的默认语言。例如,如果设置为英式英语,那么SQL Server会将您的格式默认为DMY,当显示nnnn模式时,它会将其视为YDM,尽管英国没有人这样解释这些日期。老实说,@Damien_不信者,我不知道有谁会读一个日期并将其解释为yyyy dd MM;我可以问一下为什么我的日期格式会设置为YDM吗?这是我可以更改的设置吗?@JGee-默认设置取决于您登录的默认语言。例如,如果设置为英式英语,那么SQL Server会将您的格式默认为DMY,当显示nnnn模式时,它会将其视为YDM,尽管英国没有人这样解释这些日期。老实说,@Damien_不信者,我不知道有谁会读一个日期并将其解释为yyyy dd MM;
insert into dbo.#DateTimeTest (created) VALUES ('2020-06-12T05:46:00.00');
insert into dbo.#DateTimeTest (created) VALUES ('2020-06-19T05:31:00.00');
set dateformat YMD;