我知道有一个名为isdate()的函数来验证datetime列,但它只适用于smalldatetime和datetime类型.问题是:是否有类似的方法来验证sql server 2008和2012中的新数据类型datetime2?
我需要将一个数据库的属性 datetime2 与其他数据库的属性 datetime 进行比较,因为我找不到将 datetime 转换为 datetime2 的方法。
我测试一下这句话:
select CAST(FechaAlta AS datetime) from tutors
Run Code Online (Sandbox Code Playgroud)
但返回此错误消息:
将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围。
在加盟时,我得到意想不到的结果DATETIME2(3)和DATETIME与PK列,在SQL Server 2016年
我有下表:
CREATE TABLE DATETIME_TEST
(
[DATETIME] DATETIME NOT NULL,
[DATETIME2_3] DATETIME2(3)
);
ALTER TABLE DATETIME_TEST
ADD CONSTRAINT PK_DATETIME_TEST PRIMARY KEY ([DATETIME]);
INSERT INTO DATETIME_TEST ([DATETIME], [DATETIME2_3])
VALUES ('20020202 02:02:02.000', '20020202 02:02:02.000'),
('20020202 02:02:02.003', '20020202 02:02:02.003'),
('20020202 02:02:02.007', '20020202 02:02:02.007'),
('2019-04-28 07:23:29.447', '2019-04-28 07:23:29.447');
SELECT *
FROM DATETIME_TEST
WHERE CONVERT(DATETIME2(3), [DATETIME]) = [DATETIME2_3]
Run Code Online (Sandbox Code Playgroud)
结果 :
DATETIME DATETIME2_3
-------------------------------------------------
2002-02-02 02:02:02.000 2002-02-02 02:02:02.000
2002-02-02 02:02:02.003 2002-02-02 02:02:02.003
2002-02-02 02:02:02.007 2002-02-02 02:02:02.007
2019-04-28 07:23:29.447 2019-04-28 07:23:29.447 …Run Code Online (Sandbox Code Playgroud) 对于 .NET DateTime 类型,为什么推断的数据库类型是 SqlDbTypes.DateTime 而不是 SqlDbTypes.DateTime2?(见http://msdn.microsoft.com/en-us/library/yy6y35y8.aspx)
通过默认为不太精确的 SQL DateTime 类型,.NET 框架保证,默认情况下,您通过具有未指定 SqlDbType 的 SqlParameter 对象传递的任何 .NET DateTime 值肯定会因精度降低而损坏。这是一个糟糕的设计决定,IMO,考虑到仅仅保留全部价值不会有更糟糕的后果。
例如,我不能使用 SqlParameterCollection.AddWithValue 方法,因为在传递 DateTime 值时,该值会被截断为范围非常有限的 SQL DateTime 值。结果是:
由于 .NET DateTime 在精度和范围上最接近于 SQL Server 2008 数据类型“datetime2(7)”,为什么框架将 SqlParameter 值转换为 SQL DateTime,以及有什么方法可以更改默认行为所以我仍然可以使用类型推断功能吗?
我能看到的唯一建议是该功能已损坏,我应该始终明确指定数据类型,这将需要大量代码更改。我想如果框架只是保留 .NET DateTime 值的原始值,问题会更少。如果数据库字段类型恰好是不太精确的 SQL DateTime 类型,那么传递给查询的日期/时间字符串值将被数据库引擎截断。如果超出范围,您将如预期的那样收到错误消息。更重要的是,如果数据库字段类型是datetime2,那么一切都会顺利进行,记录也会正确匹配。
在Entity Framework 6 Code First中,有没有办法强制所有DateTime属性建模为DateTime2?
我知道我能做到
.HasColumnType("datetime2")
Run Code Online (Sandbox Code Playgroud)
在每个单独的DateTime属性上,但我想知道是否有办法将其设置为所有 DateTime属性的默认值.
我正在编写一个脚本来分析SQL Server 2008数据库中数千个表中包含的一些数据.
为简单起见,表格可以分为4-8个半相关表格.通过半关联,我的意思是它们是同一项的数据集合,但它们没有任何实际的SQL关系.每个表由一个日期-时间戳(的datetime2数据类型),值(可以是一个bit,int或float根据特定的项目),和当前不感兴趣的一些其它列.日期时间标记在几秒钟内每15分钟(在四分之一小时内)设置; 然而,并非所有数据都是同时准确记录的......
例如:
表格1:
TIMESTAMP VALUE
2014-11-27 07:15:00.390 1
2014-11-27 07:30:00.390 0
2014-11-27 07:45:00.373 0
2014-11-27 08:00:00.327 0
Run Code Online (Sandbox Code Playgroud)
TABLE2:
TIMESTAMP VALUE
2014-11-19 08:00:07.880 0
2014-11-19 08:15:06.867 0.0979999974370003
2014-11-19 08:30:08.593 0.0979999974370003
2014-11-19 08:45:07.397 0.0979999974370003
Run Code Online (Sandbox Code Playgroud)
表3
TIMESTAMP VALUE
2014-11-27 07:15:00.390 0
2014-11-27 07:30:00.390 0
2014-11-27 07:45:00.373 1
2014-11-27 08:00:00.327 1
Run Code Online (Sandbox Code Playgroud)
如您所见,并非所有表都以相同的季度开始TIMESTAMP.基本上,我所追求的是一个查询,它将从3个表中最早的每个15分钟间隔返回3个表中每个表的VALUE TIMESTAMP.对于给出的示例,我想在2014-11-27 07:15开始(不关心秒......因此,需要允许时间戳为+ - 1分钟左右).当没有特定TIMESTAMP的记录时,返回NULL值是可以的.因此,我列出的示例的查询将返回如下内容:
TIMESTAMP VALUE1 VALUE2 VALUE3
2014-11-27 07:15 1 NULL 0
2014-11-27 07:30 0 NULL …Run Code Online (Sandbox Code Playgroud) 我已经在 SQL Server 2008 的存储过程中使用 SYSDATETIME 进行了一些测试。我已经设置了一个带有 IDENTITY 字段的 datetime2(7) 表。
我了解这种数据类型的精度和准确度之间的区别,但是,在从这个例子中插入多条记录时,我注意到一个不寻常的结果:
declare @counter int
set @counter = 0
while @counter < 100000
begin
set @counter = @counter + 1
INSERT INTO t ([now]) VALUES (SYSDATETIME())
end
Run Code Online (Sandbox Code Playgroud)
我循环使用插入语句 100,000 来确定 SYSDATETIME 是否按预期正常工作。但是,与 GETDATE 相比,它似乎并不准确。
2015-12-01 19:16:58.4102452
2015-12-01 19:16:58.4102452
2015-12-01 19:16:58.4112452
2015-12-01 19:16:58.4112452
2015-12-01 19:16:58.4122453
2015-12-01 19:16:58.4122453
2015-12-01 19:16:58.4132453
2015-12-01 19:16:58.4152455
2015-12-01 19:16:58.4152455
2015-12-01 19:16:58.4162455
2015-12-01 19:16:58.4162455
2015-12-01 19:16:58.4172456
2015-12-01 19:16:58.4172456
2015-12-01 19:16:58.4182456
2015-12-01 19:16:58.4182456
2015-12-01 19:16:58.4192457
2015-12-01 19:16:58.4192457
2015-12-01 19:16:58.4202457 …Run Code Online (Sandbox Code Playgroud) 我有一个价值
DateTime dt = DateTime.Parse("2015-10-12 14:24:40.582");
Run Code Online (Sandbox Code Playgroud)
用它我做:
SomeEntity someEntity = new SomeEntity()
{
ID = 1,
ChangedOn = dt
};
context.SomeEntities.Add(someEntity);
Run Code Online (Sandbox Code Playgroud)
我发现:在数据库表中存储的值是"2015-10-12 14:24:40.58 3 0000"
我手动找到它
SELECT CONVERT(datetime2, ChangedOn) FROM SomeEnititiesTable WHERE ID=1;
Run Code Online (Sandbox Code Playgroud)
我从数据库加载someEntity并执行
bool ok = someEntity.ChangedOn.Equals(dt);
Run Code Online (Sandbox Code Playgroud)
问题是,ok == false当我期待ok == true.:|
如何在实体框架中首先生成代码生成datetime2类型的列而不是迁移中的datetime?
类似于问题如何让 Dapper 将 .net DateTime 映射到 DateTime2;但我希望事后能够将其重新设置回来。
该问题当前接受的答案涉及更改 Dapper 源文件;但我正在使用 NuGet 包,所以这对我不起作用。正如对已接受答案的第一条评论所指出的,这是不可逆的 - “如果有些是 DateTime 而另一些是 DateTime2 怎么办?” - 这就是我的场景:不同的查询需要不同的映射(每个查询只需要其中之一)。
我正在使用同一问题的得票较高的答案。然而,这种做法似乎也是不可逆转的。似乎第一个查询完成时设置的任何值都会保留,并且此后不可更改。
以下代码是 MCVE。如果运行它,您会看到类型始终显示为“datetime”,并且值的精度永远不会超过毫秒(正如您对日期时间的期望);尽管尝试改变映射。然后,您必须注释掉对“PerformDapperQuery()”的第一次调用,然后再次运行它:您现在将看到该类型始终返回为“datetime2”,并且这些值在秒的小数部分上具有完整的 7 位精度(正如您对 datetime2 的期望)。
public static void Main()
{
// I know this is marked as obsolete, and I am open to suggestions for alternatives.
// see https://github.com/StackExchange/Dapper/issues/798
#pragma warning disable 618
var oldValue = SqlMapper.LookupDbType(typeof(DateTime), null, false, out var handler);
#pragma warning restore 618
PerformDapperQuery();
SqlMapper.AddTypeMap(typeof(DateTime), …Run Code Online (Sandbox Code Playgroud) 我已经受到了starnge分配的帮助,我需要将40个表列从datetime2转换为datetime.
这是我在我的数据库中拥有的日期时间格式.2007-11-12 00:00:00
它包含超过90,000条记录
请协助