对于想了解当DateTime有值时,为什么可为null的DateTimeHasValue返回false?的读者,本文将提供新的信息,我们将详细介绍datetime为空插什么数据,并且为您提供关于c#–
对于想了解当 DateTime 有值时,为什么可为 null 的 DateTime HasValue 返回 false?的读者,本文将提供新的信息,我们将详细介绍datetime为空插什么数据,并且为您提供关于c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value、Database returned an invalid datetime value. Are time zone definitions for your database installed?、DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)、datetime、timestamp、date、datetime、Calendar(Java)的有价值信息。
本文目录一览:- 当 DateTime 有值时,为什么可为 null 的 DateTime HasValue 返回 false?(datetime为空插什么数据)
- c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value
- Database returned an invalid datetime value. Are time zone definitions for your database installed?
- DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)
- datetime、timestamp、date、datetime、Calendar(Java)
当 DateTime 有值时,为什么可为 null 的 DateTime HasValue 返回 false?(datetime为空插什么数据)
如何解决当 DateTime 有值时,为什么可为 null 的 DateTime HasValue 返回 false??
以下 sql 语句返回 844 行:
SELECT <column list>
FROM v_TEST_REQUEST_INVOICE
WHERE ARCHIVE_DATE IS NULL
AND STATUS_ID = 8
AND JOURNAL_ENTRY_NUMBER IS NULL
AND BILLING_PROCESS_DATE IS NOT NULL
在 sql Server 中,STATUS_ID
是 int
,JOURNAL_ENTRY_NUMBER
是 varchar(30)
,BILLING_PROCESS_DATE
是 datetime
,它接受空值。>
在 C# 中,在我的 TestRequestInvoice
类中,STATUS_ID
是一个 int,JOURNAL_ENTRY_NUMBER
是一个字符串,而 BILLING_PROCESS_DATE
是一个 DateTime?
(可为空的 DateTime)
使用 Dapper,我将 v_TEST_REQUEST_INVOICE
中选择的相关列的结果(没有 WHERE
子句)提取到 List<TestRequestInvoice>
中。
使用 VS Debugger 我可以看到列表中有 1893 个成员。然后我使用 LINQ 尝试将 List 限制为仅匹配 where 子句的那些成员,期望保留 844 个成员。
test_request_invoices = test_request_invoices.Where(tri => tri.STATUS_ID == 8 && tri.JOURNAL_ENTRY_NUMBER == null && tri.BILLING_PROCESS_DATE.HasValue).ToList();
但结果是一个空列表。为什么???我做错了什么?
我已经看过Checking to see if a DateTime variable has had a value assigned
中的答案更新:这是 Dapper 生成的 sql 代码:
SELECT
[TEST_REQUEST_ID],[SCHEDULE_ITEM_ID],[STUDENT_ID],[STUDENT_LFNAME],[BUDGET_ID],[MNEMONIC],[COORDINATOR_ID],[PERIOD_ID],[PERIOD_NAME],[TEST_TYPE_ID],[STATUS_ID],[STATUS],[STATUS_DATE],[CANCELLATION_STATUS_ID],[CANCELLATION_STATUS],[TEST_COMPLETED],[RAW_score],[CONVERTED_score],[FINAL_ID],[TEST_RESULT_APPRoval_BY],[TEST_RESULT_APPRoval_DATE],[LATE_CANCELLATION_COMMENTS],[RESULTS_REPORTED_BY],[RESULTS_REPORTED_DATE],[SC_POSTED_score_NOTIFIED],[LIONPATH_UPLOAD_PREP],[INVOICE_ACCOUNT],[INVOICE_FUND],[INVOICE_OBJECT_CODE],[INVOICE_COST_CENTER],[SIMBA_COST_CENTER],[SIMBA_INTERNAL_ORDER],[AMOUNT],[INVOICE_AMOUNT_REASON],[JOURNAL_ENTRY_NUMBER],[AA_INVOICE_NOTIFIED],[INVOICING_AA],[INVOICING_AA_EMAIL],[INVOICING_AA_LFNAME],[INVOICING_AA_PHONE],[ADD_BY],[ADD_DATE],[CHANGE_BY],[CHANGE_DATE],[ARCHIVE_BY],[ARCHIVE_DATE]
FROM v_TEST_REQUEST_INVOICE
WHERE ARCHIVE_DATE IS NULL
ORDER BY ADD_DATE
解决方法
您的 SELECT
子句似乎没有 BILLING_PROCESS_DATE
的条目,因此即使您只为具有非空日期的行选择数据,您也没有得到结果中的实际日期。
c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value
如果变量有值,则没有问题.
但如果它没有值,则插入中断错误.
我想问:我们如何通过DbCommand参数将可空的DateTime插入sql?
(P.S.:sql列也可以为空.)
DateTime? myDate = null; DbCommand dbCommand = new DbCommand(); dbCommand.Parameters.Add("NullablesqlDateField",DbType.DateTime,myDate);
解决方法
dbCommand.Parameters.Add("NullablesqlDateField",(object) myDate ?? dbnull.Value);
Database returned an invalid datetime value. Are time zone definitions for your database installed?
在做文章归档的会后,打印结果时报了这个错误
ret = models.Article.objects.filter(user=user).annotate(month=TruncMonth(''created_time'')).values(''month'').annotate(
count=Count(''nid'')).values_list(
''month'', ''count'')
print(r''------>'', ret)
原因是时区问题
解决方案
在mysql设置时区
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
修改django project下的settings.py中市区配置信息:
#USE_TZ = True
# TIME_ZONE = ''UTC''
USE_TZ = False
TIME_ZONE = ''Asia/Shanghai''
USE_TZ是统一全球的时间,不夸时区的应用可以把这个设置为False
设置USE_TZ为True的显示格式
<QuerySet [(datetime.datetime(2019, 2, 1, 0, 0, tzinfo=<DstTzInfo ''Asia/Shanghai'' CST+8:00:00 STD>), 2)]>
设置USE_TZ为Flase的显示格式
<QuerySet [(datetime.datetime(2019, 2, 1, 0, 0), 2)]>
参考:https://www.cnblogs.com/yy3b2007com/p/7601940.html#autoid-0-1-0
USE_TZ = True会自动转成UTC时间,用mysql的时候要注意这个问题。
启用 USE_TZ = True 后,处理时间方面,有两条 “黄金法则”:
- 保证存储到数据库中的是 UTC 时间;
- 在函数之间传递时间参数时,确保时间已经转换成 UTC 时间;
比如,通常获取当前时间用的是:
import datetime
now = datetime.datetime.now()
启用 USE_TZ = True 后,需要写成:
import datetime
from django.utils.timezone import utc
utcnow = datetime.datetime.utcnow().replace(tzinfo=utc)
模板
除非应用支持用户设置自己所在的时区,通常我们不需要关心模板的时区问题。模板在展示时间的时候,会使用 settings.TIME_ZONE 中的设置自动把 UTC 时间转成 settings.TIME_ZONE 所在时区的时间渲染。
TIME_ZONE = ''Asia/Shanghai''
DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)
SQL Server 中 DateTime , DateTime2 ,DateTimeOffset 的区别
闲来无事列了个表比对一下这 3 兄弟之间还是有一点差距的╮(╯_╰)╭
|
DateTime
|
DateTime2
|
DateTimeOffset
|
日期范围 |
1753-01-01 到 9999-12-31
|
0001-01-01 到 9999-12-31
|
0001-01-01 到 9999-12-31
|
时间范围 |
00:00:00 到 23:59:59.997
|
00:00:00 到 23:59:59.9999999
|
00:00:00 到 23:59:59.9999999
|
存储字节大小
|
8 字节
|
精度小于 3 时为 6 个字节;精度为 3 和 4 时为 7 个字节。 所有其他精度则需要 8 个字节 |
精度小于 3 时为 6 个字节;精度为 3 和 4 时为 7 个字节。 所有其他精度则需要 8 个字节 |
精度 |
舍入到 .000、.003 或 .007 秒三个增量。
|
100 纳秒
|
100 纳秒
|
支持自定义小数精度
|
否
|
是 |
是
|
时区
|
无
|
无
|
-14:59 到 +14:59
|
至于 DateTimeOffset ,时间部分都是 UTC 时间。
比方说现在我们在 GMT+8:00 的位置,所以当地时间是 2019-12-09 21:33:26,如果用 DateTimeOffset 来表示就是 2019-12-09 13:33:26 -08:00
DECLARE @dto DATETIMEOFFSET(7)=N''2019-12-09 21:33:26 +08:00''
DECLARE @dtLocal DATETIME=N''2019-12-09 21:33:26''
DECLARE @dtUTC DATETIME=N''2019-12-09 13:33:26''
SELECT @dto,@dtLocal,DATEDIFF(HH,@dto,@dtLocal),@dtUTC,DATEDIFF(HH,@dto,@dtUTC)
结果如下:
然后就是在 SQL Server 中,当 DateTimeOffset 转格式成为其它 2 兄弟的时候,时区会被舍去的啊…… 的啊…… 的啊
DECLARE @dto DATETIMEOFFSET(7)=SYSDATETIMEOFFSET()
SELECT @dto,CAST(@dto AS DATETIME),CAST(@dto AS DATETIME2(7))
结果如下:
原文链接
C# 中 DateTime 和 DateTimeOffset 的区别
可以理解为 DateTimeOffset 是带时区偏差的 DateTime,如下 MSDN 代码所示:
using System;
using System.Collections.ObjectModel;
public class TimeOffsets
{
public static void Main()
{
DateTime thisDate = new DateTime(2007, 3, 10, 0, 0, 0);
DateTime dstDate = new DateTime(2007, 6, 10, 0, 0, 0);
DateTimeOffset thisTime;
thisTime = new DateTimeOffset(dstDate, new TimeSpan(-7, 0, 0));
ShowPossibleTimeZones(thisTime);
thisTime = new DateTimeOffset(thisDate, new TimeSpan(-6, 0, 0));
ShowPossibleTimeZones(thisTime);
thisTime = new DateTimeOffset(thisDate, new TimeSpan(+1, 0, 0));
ShowPossibleTimeZones(thisTime);
}
private static void ShowPossibleTimeZones(DateTimeOffset offsetTime)
{
TimeSpan offset = offsetTime.Offset;
ReadOnlyCollection<TimeZoneInfo> timeZones;
Console.WriteLine("{0} could belong to the following time zones:",
offsetTime.ToString());
// Get all time zones defined on local system
timeZones = TimeZoneInfo.GetSystemTimeZones();
// Iterate time zones
foreach (TimeZoneInfo timeZone in timeZones)
{
// Compare offset with offset for that date in that time zone
if (timeZone.GetUtcOffset(offsetTime.DateTime).Equals(offset))
Console.WriteLine(" {0}", timeZone.DisplayName);
}
Console.WriteLine();
}
}
// This example displays the following output to the console:
// 6/10/2007 12:00:00 AM -07:00 could belong to the following time zones:
// (GMT-07:00) Arizona
// (GMT-08:00) Pacific Time (US & Canada)
// (GMT-08:00) Tijuana, Baja California
//
// 3/10/2007 12:00:00 AM -06:00 could belong to the following time zones:
// (GMT-06:00) Central America
// (GMT-06:00) Central Time (US & Canada)
// (GMT-06:00) Guadalajara, Mexico City, Monterrey - New
// (GMT-06:00) Guadalajara, Mexico City, Monterrey - Old
// (GMT-06:00) Saskatchewan
//
// 3/10/2007 12:00:00 AM +01:00 could belong to the following time zones:
// (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
// (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
// (GMT+01:00) Brussels, Copenhagen, Madrid, Paris
// (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb
// (GMT+01:00) West Central Africa
微软官方对 C# 中 DateTime 和 DateTimeOffset 区别的解释:
Choosing between DateTime, DateTimeOffset, TimeSpan, and TimeZoneInfo
datetime、timestamp、date、datetime、Calendar(Java)
datetime:
1.允许为空值、可以自定义值,系统不会自动修改其值。
2.不可以设定默认值,所以在不允许为空值的情况下,所以手动指定datetime字段的值才能成功插入数据。
3.虽然不可以设定默认值,但是可以指定datetime字段的值的时候使用now()变量来自动插入系统的当前时间。
显示格式 YYYY-MM-DD HH:mm:ss 显示范围 1601-01-01 到 9999-01-01 (sql)
end:datetime类型适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime字段的值都不会改变,除非你手动更改它。
timestamp:
1.允许为空值,但是不可以自定义值,所以为空值时没有任何意义。
2.默认值为CURRENT_TIMESTAMO(),其实也就是当前的系统时间。
3.数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,对应的记录timestamp值 会自动更新为当前的系统时间。
显示格式 YYYY-MM-DD HH:mm:ss 显示范围 1601-01-01 00:00:00 到 9999-12-31 23:59:59 (sql)
end:timestamp类型适合记录数据的最后修改时间,因为只要你更改了记录中的其他字段的值,timestamp字段的值都会自动更新
date:
显示格式 YYYY-MM-DD 显示范围 1601-01-01 00:00:00 到 9999-12-31 23:59:59 (sql)
time:
显示格式 HH:mm:ss 显示范围 00:00:00 到 23:59:59 (sql)
calendar:
在处理日期和时间时,系统推荐使用Calendar进行实现。再设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一点。
Calednar类时抽象类,且Calendar类的构造方法时protected的,所以无法使用Calendar类的构造方法来创建对象,API提供了getInstance方法用来创建对象。
使用该方法获取的Calendar对象就代表当前的系统时间,由于Calendar类tostring实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。
Calendar c1=Calendar.getInstance();
c1.set(2019,12-1,21);
使用Calendar类代表特定的时间,首先需要创建一个Calendar的对象,然后再谁都能该对象中的年月日参数来完成。
以上示例设置的时间为2019年12月21日。其参数的结构和Date类不一样,Calendar类中的年份的数值直接书写,月份的值为实际的月份减1,日期的值是实际日期的值。
Calendar.YEAR:年份、Calendar.MONTH:月份、Calendar.DATE:日期
Calendar.DAY_OF_MONTH:日期,和上面的字段完全相同、Calendar.HOUR:12小时制的小时数、Calendar.HOUR_OF_DAY:24小时制的小时数
Calendar.MINUTE:分钟、Calendar.SECOND:秒、Calendar.DAY_OF_WEEK:星期几
c1.set(Calendar.DATE,10);
该代码的作用是将c1对象代表的时间中日期设置为10号,其他所有的数值会被重新计算,例如星期几以及对应的相对时间数值等。
Caledar c2=Calendar.getInstance();
int year=c2.get(Calendar.YEAR); int month = c2.get(Calendar.MONTH) + 1; int date = c2.get(Calendar.DATE); int hour = c2.get(Calendar.HOUR_OF_DAY);
int minute = c2.get(Calendar.MINUTE); int second = c2.get(Calendar.SECOND); int day = c2.get(Calendar.DAY_OF_WEEK);
get方法的声明如下: public int get(int field)
其中参数field代表需要获得的字段的值,字段说明和上面的set方法保持一致。获得的月份为实际的月份值减1,获得的星期的值和Date类不一样。
在Calendar类中,周日是1,周一是2,周二是3,以此类推。
add方法:
public abstract void add(int field,int amount)
该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加是amount的值为正,减少时amount的值为负。
c2.add(Calendar.DATE, 100);
这里add方法是指在c2对象的Calendar.DATE,也就是日期字段上增加100,类内部会重新计算该日期对象中其它各字段的值,从而获得100天以后的日期
after方法:
public boolean after(Object when)
该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。例如:
Calendar c4 = Calendar.getInstance();
c4.set(2009, 10 - 1, 10);
Calendar c5 = Calendar.getInstance();
c5.set(2010, 10 - 1, 10);
boolean b = c5.after(c4);
在该示例代码中对象c4代表的时间是2009年10月10号,对象c5代表的时间是2010年10月10号,则对象c5代表的日期在c4代表的日期之后,所以after方法的返回值是true。
另外一个类似的方法是before,该方法是判断当前日期对象是否位于另外一个日期对象之前。
getTime方法:
public final Date getTime()
该方法的作用是将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。
类似的方法是setTime,该方法的作用是将Date对象转换为对应的Calendar对象,该方法的声明如下:
public final void setTime(Date date)
转换的示例代码如下:
public final void setTime(Date date)
转换的示例代码如下:
Date d = new Date();
Calendar c6 = Calendar.getInstance();
//Calendar类型的对象转换为Date对象
Date d1 = c6.getTime();
//Date类型的对象转换为Calendar对象
Calendar c7 = Calendar.getInstance();
c7.setTime(d);
Calendar对象和相对时间之间的互转:
Calendar c8 = Calendar.getInstance();
long t = 1252785271098L;
//将Calendar对象转换为相对时间
long t1 = c8.getTimeInMillis();
//将相对时间转换为Calendar对象
Calendar c9 = Calendar.getInstance();
c9.setTimeInMillis(t1);
在转换时,使用Calendar类中的getTimeInMillis方法可以将转换为相对时间。在将相对时间转换为Calendar对象时,首先要创建一个Calendar对象,然后再使用Calendar类的setTimeInMillis方法设置时间即可。
关于当 DateTime 有值时,为什么可为 null 的 DateTime HasValue 返回 false?和datetime为空插什么数据的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value、Database returned an invalid datetime value. Are time zone definitions for your database installed?、DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)、datetime、timestamp、date、datetime、Calendar(Java)等相关知识的信息别忘了在本站进行查找喔。
本文标签: