本文将为您提供关于了解带有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)
- c# – 带有时区的SQL Server的DateTime
- c#中的DateTime和SQL Server中的DateTime有什么区别?
- DateTime2与SQL Server中的DateTime
- JFinal sqlserver datetime 字段
了解带有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
但是在创建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有什么区别?
答案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
哪一个:
-
datetime
-
datetime2
是在SQL Server 2008+中存储日期和时间的推荐方法吗?
我知道精度(和存储空间可能)的差异,但暂时忽略这些,是否有关于何时使用什么的最佳实践文档,或者我们应该只使用datetime2
?
#1楼
datetime2在大多数方面获胜,除了(旧应用程序兼容性)
- 更大范围的价值观
- 更好的准确性
- 较小的存储空间 (如果指定了可选的用户指定精度)
请注意以下几点
- 句法
- 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
设置时,日期字符串到datetime
和datetime2
也可能不同。 例如
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 。 以下是他们的建议:
使用
time
,date
,datetime2
和datetimeoffset
数据类型进行新工作。 这些类型与SQL标准一致。 它们更便携。time
,datetime2
和datetimeoffset
提供更多的秒精度。datetimeoffset
为全局部署的应用程序提供时区支持。
datetime2具有更大的日期范围,更大的默认小数精度和可选的用户指定精度。 此外,根据用户指定的精度,它可能使用较少的存储空间。
#5楼
我认为DATETIME2
是存储date
的更好方法,因为它比DATETIME
具有更高的效率。 在SQL Server 2008
您可以使用DATETIME2
,它存储日期和时间,需要6-8 bytes
进行存储,精度为100 nanoseconds
。 所以任何需要更高时间精度的人都需要DATETIME2
。
JFinal sqlserver datetime 字段
请问一下:sqlserver 数据库中字段类型是 datetime,映射 java 类型的 java.util.date,为什么像字段保存数据用 java.util.date 会报不支持从 UNKNOWN 到 UNKNOWN 的转换。,用 java.sql.date 就没问题
今天的关于了解带有min和datetime的SQL Server行为的分享已经结束,谢谢您的关注,如果想了解更多关于c# – 带有时区的SQL Server的DateTime、c#中的DateTime和SQL Server中的DateTime有什么区别?、DateTime2与SQL Server中的DateTime、JFinal sqlserver datetime 字段的相关知识,请在本站进行查询。
本文标签: