GVKun编程网logo

当 DateTime 有值时,为什么可为 null 的 DateTime HasValue 返回 false?(datetime为空插什么数据)

19

对于想了解当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为空插什么数据)

当 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_IDintJOURNAL_ENTRY_NUMBERvarchar(30)BILLING_PROCESS_DATEdatetime,它接受​​空值。>

在 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

c# – 如何将Nullable DateTime变量的null值转换为DbNull.Value

我有一个可以为空的DateTime变量.我想把它写到sql DB.当我尝试插入时:

如果变量有值,则没有问题.

但如果它没有值,则插入中断错误.

我想问:我们如何通过DbCommand参数将可空的DateTime插入sql?

(P.S.:sql列也可以为空.)

DateTime? myDate = null;
DbCommand dbCommand = new DbCommand();
dbCommand.Parameters.Add("NullablesqlDateField",DbType.DateTime,myDate);

解决方法

试试 null coalescing operator:

dbCommand.Parameters.Add("NullablesqlDateField",(object) myDate ?? dbnull.Value);

Database returned an invalid datetime value. Are time zone definitions for your database installed?

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 后,处理时间方面,有两条 “黄金法则”:

  1. 保证存储到数据库中的是 UTC 时间;
  2. 在函数之间传递时间参数时,确保时间已经转换成 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 之间的小区别 (转载)

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、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)等相关知识的信息别忘了在本站进行查找喔。

本文标签: