GVKun编程网logo

了解带有min(datetime)的SQL Server行为(sql中minus)

12

本文将为您提供关于了解带有min的详细介绍,我们还将为您解释datetime的SQLServer行为的相关知识,同时,我们还将为您提供关于c#–带有时区的SQLServer的DateTime、c#中的

本文将为您提供关于了解带有min的详细介绍,我们还将为您解释datetime的SQL Server行为的相关知识,同时,我们还将为您提供关于c# – 带有时区的SQL Server的DateTime、c#中的DateTime和SQL Server中的DateTime有什么区别?、DateTime2与SQL Server中的DateTime、JFinal sqlserver datetime 字段的实用信息。

本文目录一览:

了解带有min(datetime)的SQL Server行为(sql中minus)

了解带有min(datetime)的SQL Server行为(sql中minus)

(长话短说,我只是一个愚蠢的假设,我确定一栏是一个日期时间,而且不是-
所以不要指望在这个问题中找到任何有趣的东西,把它留在这里以使dems正确地被他接受回答)

我写了一个简单的查询,像这样:

SELECT ID,MIN(DateMadeActive) AS DateMadeActive
FROM RecordStateField WHERE RecordStatusID in (2,3)
GROUP BY ID

其中DateMadeActive是日期时间列。这返回了我期望的结果:

ID  DateMadeActive
1   20/06/2011 16:15:04
2   20/06/2011 16:14:28

现在,我将其插入到新表中,但是将MIN(DateMadeActive)的结果插入另一个表的datetime列中时,出现了此错误:

Msg 8115,Level 16,State 2,Line 1
Arithmetic overflow error converting expression to data type datetime.

因此,要对此进行测试,我将选择更改为:

SELECT ID,CAST(Min(DateMadeActive) as datetime) AS DateMadeActive
FROM RecordStateField WHERE RecordStatusID in (2,3)
GROUP BY ID

同样的例外。我可以这样写,并使其工作:

SELECT ID,CONVERT(datetime,Min(DateMadeActive),103) AS DateMadeActive
FROM RecordStateField WHERE RecordStatusID in (2,3)
GROUP BY ID

这样我就可以使它工作,但这使我感到困惑。MIN(expression)的文档说返回类型应该与expression相同,但是似乎正在发生的是MIN(datetime)返回nvarchar(255)。我可以通过运行以下命令来确认这一点:

SELECT ID,Min(DateMadeActive) AS DateMadeActive
INTO TestTable
FROM RecordStateField WHERE RecordStatusID in (2,3)
GROUP BY ID

而且我可以看到DateMadeActive列的类型为nvarchar(255)。有人对此有任何启示吗?只是MSDN中的一个文档错误?

c# – 带有时区的SQL Server的DateTime

c# – 带有时区的SQL Server的DateTime

当我执行查询并使用DataReader访问该值并将其转换为字符串时,我没有得到TimeZone(2015-02-17T00:00:00).

但是在创建DataSet然后将其转换为XML时,我在DateTime字段中获取TimeZone(2015-02-17T00:00:00 11:00).

从datareader检索数据的代码是var dateTime = reader [“dte_tme”].ToString()产生17/02/2015 12:00:00 AM(没有TimeZone).

string dateTime = reader["dte_tme"].ToString();
DateTime dt = Convert.ToDateTime(dateTime);

所以我知道字段’dte_tme’是一个DateTime字段,可能并不总是有值.我正在将其转换为字符串,然后将其转换回DateTime.然后将dt的值序列化为json.我得到的输出是2015-02-17T00:00:00而不是2015-02-17T00:00:00 11:00.我检查了dt的TimeZone,它是未指定的.

我从DataSet的XML创建的DateTime对象将TimeZone作为Local,序列化为2015-02-17T00:00:00 11:00.

为什么这种不一致?

另外,有没有办法使用DataReader获取TimeZone的DateTime?

我的最终目标是以ISO 8601格式序列化DateTime字段.

解决方法

这是一种非常常见的反模式:

string dateTime = reader["dte_tme"].ToString();
DateTime dt = Convert.ToDateTime(dateTime);

正确的咒语如下:

DateTime dt = (DateTime) reader["dte_tme"];

虽然reader [“dte_time”]的返回类型是一个对象,但该对象包含一个DateTime.如果设置断点,则会看到DateTime已经存在.您只需要cast它就可以将其分配给DateTime变量.这叫做unboxing.

如果sql数据库中的datetime列可以为空,那么您应该像这样测试:

DateTime? dt = reader["dte_tme"] == dbnull.Value ? null : (DateTime) reader["dte_tme"];

或者有时您会看到这样,这同样可以接受:

DateTime? dt = reader["dte_tme"] as DateTime?;

从数据库中检索它时,绝对不需要在任何时候将其视为字符串.如果它是数据库中的日期时间,则它是C#中的DateTime.

从datareader中提取数据时,应使用转换操作,即使使用其他数据类型(如整数,小数甚至字符串)也是如此.您可以在sql Server数据类型和.NET数据类型in the chart here之间查看其他类型映射.

现在关于时区,这是一个不同的问题.首先,要了解DateTime没有保留时区.它只知道它被分配的DateTimeKind.默认情况下,类型是未指定的,这实际上意味着“我不知道;它可能是任何东西”.

也就是说,不同的协议有不同的要求. JSON没有日期的预定义格式,但最常见的约定(和最佳实践)是以ISO8601格式存储日期,即YYYY-MM-DDTHH:mm:ss.时区信息是可选的,当DateTime的.Kind为DateTimeKind.Unspecified时,通常不会包含时区信息.如果它是Utc,那么你会在最后看到Z,如果它是Local,那么你会看到本地时区的偏移量,例如11:00.也就是说,在该特定时刻,任何偏移都适合于该时区.偏移量与“time zone”不同,因为不同的偏移量可能在不同时间在同一时区内应用 – 通常为daylight saving time.

XML有点不同. .NET中的大多数XML序列化都将使用W3C XML Schema规范,并将DateTime映射到xsd:dateTime类型.它的确切呈现方式取决于种类.

>对于DateTimeKind.Unspecified,它不包含偏移量.
>对于DateTimeKind.Utc,它将附加一个Z.
>对于DateTimeKind.Local,它将附加本地偏移量

当你在数据集中查看它时,你问为什么Kind是Local?那是因为DataSet有一种丑陋的行为,假设所有时间都是本地的.它基本上忽略.Kind属性并假定DateTimeKind.Local的行为.这是一个长期存在的错误.

理想情况下,您将在sql Server中使用datetimeoffset类型,在.NET中使用DateTimeOffset类型.这避免了“类型”问题,并在JSON中很好地序列化(当您使用像JSON.NET这样的现代序列化器时).但是,在XML中,它应该映射到xsd:dateTime并像本地DateTime一样呈现,只是使用正确的偏移量.然而它最终看起来像这样:

<Value xmlns:d2p1="http://schemas.datacontract.org/2004/07/System">
    <d2p1:DateTime>2015-03-18T03:34:11.3097587Z</d2p1:DateTime>
    <d2p1:OffsetMinutes>-420</d2p1:OffsetMinutes>
</Value>

那就是DataContractXmlSerializer.如果您使用XmlSerializer,则它根本无法呈现.您只需获得一个空节点,例如< Value />.

但是,即使说了所有这些,你说你使用的是DataSet,并且它带有它自己的一组行为.在坏的方面,它将假设所有DateTime值都具有DateTimeKind.Local – 即使它们没有,如上所述.考虑以下:

DataTable dt = new DataTable();
dt.Columns.Add("Foo",typeof (DateTime));

dt.Rows.Add(new DateTime(2015,1,DateTimeKind.Unspecified));
dt.Rows.Add(new DateTime(2015,DateTimeKind.Local));
dt.Rows.Add(new DateTime(2015,DateTimeKind.Utc));

DataSet ds = new DataSet();
ds.Tables.Add(dt);
string xml = ds.GetXml();

Debug.Write(xml);

这是我运行时的输出(在美国太平洋时区):

<NewDataSet>
  <Table1>
    <Foo>2015-01-01T00:00:00-08:00</Foo>
  </Table1>
  <Table1>
    <Foo>2015-01-01T00:00:00-08:00</Foo>
  </Table1>
  <Table1>
    <Foo>2015-01-01T00:00:00-08:00</Foo>
  </Table1>
</NewDataSet>

但是,好消息是DateTimeOffset值更好一些:

DataTable dt = new DataTable();
dt.Columns.Add("Foo",typeof(DateTimeOffset));

dt.Rows.Add(new DateTimeOffset(2015,TimeSpan.FromHours(11)));
dt.Rows.Add(new DateTimeOffset(2015,TimeSpan.Zero));
dt.Rows.Add(new DateTimeOffset(2015,TimeSpan.FromHours(-3)));

DataSet ds = new DataSet();
ds.Tables.Add(dt);
string xml = ds.GetXml();

Debug.Write(xml);

输出:

<NewDataSet>
  <Table1>
    <Foo>2015-01-01T00:00:00+11:00</Foo>
  </Table1>
  <Table1>
    <Foo>2015-01-01T00:00:00Z</Foo>
  </Table1>
  <Table1>
    <Foo>2015-01-01T00:00:00-03:00</Foo>
  </Table1>
</NewDataSet>

在大多数情况下,这是正确的,虽然从技术上来说它应该使用00:00而不是Z序列化第二个,但这在实践中并不重要.

我想说的最后一件事是,一般来说,DataSet是过去的遗物.在现代开发中,应该很少需要在日常代码中使用它.如果可能的话,我会认真考虑探索其他选择.

c#中的DateTime和SQL Server中的DateTime有什么区别?

c#中的DateTime和SQL Server中的DateTime有什么区别?

c#中的DateTime和SQL Server中的DateTime有什么区别?

答案1

小编典典

精度和范围(因此,所有重要;-p)

从MSDN:

.NET System.DateTime

DateTime值类型表示日期和时间,值的范围为0001年1月1日午夜12:00:00 Anno
Domini(公共时代)至9999年12月31日(CE)的11:59:59 PM

时间值以100纳秒为单位进行测量,称为“滴答”,特定的日期是自公历0001年1月1日午夜12:00(公元001年)以来的滴答数。

Transact SQL日期时间

日期范围:1753年1月1日至9999年12月31日

精度:四舍五入为.000,.003或.007秒

DateTime2与SQL Server中的DateTime

DateTime2与SQL Server中的DateTime

哪一个:

  • datetime
  • datetime2

是在SQL Server 2008+中存储日期和时间推荐方法吗?

我知道精度(和存储空间可能)的差异,但暂时忽略这些,是否有关于何时使用什么的最佳实践文档,或者我们应该只使用datetime2


#1楼

datetime2在大多数方面获胜,除了(旧应用程序兼容性)

  1. 更大范围的价值观
  2. 更好的准确性
  3. 较小的存储空间 (如果指定了可选的用户指定精度)

SQL日期和时间数据类型比较 -  datetime,datetime2,date,TIME

请注意以下几点

  • 句法
    • datetime2 [(小数秒精度=>查看低于存储空间大小)]
  • 精度,规模
    • 0到7位数,精度为100ns。
    • 默认精度为7位数。
  • 存储大小
    • 6个字节,精度小于3;
    • 7个字节用于精度3和4。
    • 所有其他精度需要8个字节
  • DateTime2(3)具有与DateTime相同的位数,但使用7个字节的存储而不是8个字节( SQLHINTS- DateTime Vs DateTime2 )
  • 在datetime2上查找更多内容(Transact-SQL MSDN文章)

图像源: MCTS Self-Paced Training Kit(考试70-432):Microsoft®SQLServer®2008 - 实施和维护第3章:表格 - >第1课:创建表格 - >第66页


#2楼

DATETIME2的日期范围为“0001/01/01”至“9999/12/31”,而DATETIME类型仅支持1753-9999年。

此外,如果您需要, DATETIME2可以在时间上更精确; DATETIME限制为3 1/3毫秒,而DATETIME2可以精确到100ns。

这两种类型都映射到.NET中的System.DateTime - 没有区别。

如果您有选择,我建议尽可能使用DATETIME2 。 我没有看到使用DATETIME任何好处(向后兼容性除外) - 你会遇到更少的麻烦(日期超出范围并且麻烦这样)。

另外:如果您只需要日期(没有时间部分),请使用DATE - 它与DATETIME2一样好,也可以节省空间! :-)同样只限时间 - 使用TIME 。 这就是这些类型的用途!


#3楼

使用非美国DATEFORMAT设置时,日期字符串到datetimedatetime2也可能不同。 例如

set dateformat dmy
declare @d datetime, @d2 datetime2
select @d = ''2013-06-05'', @d2 = ''2013-06-05''
select @d, @d2

这将返回2013-05-06 (即五月六日)的datetime ,和2013-06-05进行(即六月五日) datetime2 。 然而, dateformat设置为mdy ,既@d@d2回报2013-06-05

datetime行为似乎与SET DATEFORMAT的MSDN文档不一致,后者指出: 某些字符串格式(例如ISO 8601)的解释与DATEFORMAT设置无关 。 显然不是真的!

直到我被这个咬了,我总是认为yyyy-mm-dd日期只会被正确处理,无论语言/语言环境设置如何。


#4楼

datetime的MSDN文档建议使用datetime2 。 以下是他们的建议:

使用timedatedatetime2datetimeoffset数据类型进行新工作。 这些类型与SQL标准一致。 它们更便携。 timedatetime2datetimeoffset提供更多的秒精度。 datetimeoffset为全局部署的应用程序提供时区支持。

datetime2具有更大的日期范围,更大的默认小数精度和可选的用户指定精度。 此外,根据用户指定的精度,它可能使用较少的存储空间。


#5楼

我认为DATETIME2是存储date的更好方法,因为它比DATETIME具有更高的效率。 在SQL Server 2008您可以使用DATETIME2 ,它存储日期和时间,需要6-8 bytes进行存储,精度为100 nanoseconds 。 所以任何需要更高时间精度的人都需要DATETIME2

JFinal sqlserver datetime 字段

JFinal sqlserver datetime 字段

请问一下:sqlserver 数据库中字段类型是 datetime,映射 java 类型的 java.util.date,为什么像字段保存数据用 java.util.date 会报不支持从 UNKNOWN 到 UNKNOWN 的转换。,用 java.sql.date 就没问题

今天的关于了解带有mindatetime的SQL Server行为的分享已经结束,谢谢您的关注,如果想了解更多关于c# – 带有时区的SQL Server的DateTime、c#中的DateTime和SQL Server中的DateTime有什么区别?、DateTime2与SQL Server中的DateTime、JFinal sqlserver datetime 字段的相关知识,请在本站进行查询。

本文标签: