T-SQL 有一个“时间”数据类型——C# 是否只有“时间”,而不是“日期时间”数据类型?

T-SQL has a `time` data type -- does C# have just `time`, instead of `datetime` data type?

我正在学习 asp.net-mvc 和 C#,以及 SQL 的 'T' 版本,并且还在逐渐习惯。

我有一个数据库,其中我创建了一个字段 DueDate、数据类型 Date... 和另一个字段 DueTime、数据类型 Time .sql 文件来创建 table 并使用一些示例条目作为种子。

但是在我的model.cs中,在C#中,C#中似乎只有DateTime数据类型?

但是使用该数据类型使得在视图中,您必须为 DueTime 字段输入日期 时间,这两者都不是我要,对用户来说也不方便也不好table

我搜索了文档,并在谷歌上搜索了示例,但我似乎找不到任何与我正在做的足够相似的示例,我可以推断出一些东西。

这是 .sql 文件,用于创建和播种 table:

CREATE TABLE [dbo].[Homeworks]      /* use plural db name */
(
    [ID] INT IDENTITY (1,1) NOT NULL,
    [Priority]  NVARCHAR(18)        NOT NULL,
    [DueDate]   DATE        NOT NULL,
    [DueTime]   TIME(0)     NOT NULL,
    [Dept]      NVARCHAR(4) NOT NULL,
    [Course]    NVARCHAR(9) NOT NULL,
    [Assignment]    NVARCHAR(64)    NOT NULL,
    [Notes]     NTEXT       NOT NULL,

    CONSTRAINT [PK_dbo.Homeworks] PRIMARY KEY CLUSTERED ([ID] ASC)
);

INSERT INTO [dbo].[Homeworks] (Priority, DueDate, DueTime, Dept, Course, Assignment, Notes) VALUES
    ('super-important','2019-11-11','11:59:00', 'CS', '123', 'Questions/Answers', 'best to read ch 5 first'),
    ('meh','2019-11-18','11:59:00','CS','234','write helloWorld program','find out how to write a helloWorld program'),
    ('important','2019-11-13','11:59:00','MTH','123','chapter 3 problems','do the odd-numbered ones'),
    ('regular','2019-11-15','11:59:00','WR','101','write essay paper','figure out something to write an essay about'),
    ('notes','2019-11-14','11:59:00','CS','189','do up notes over chapters 1-5','make sure you know that crap for the mid-term')

GO

这里是模型的相关部分class:

        [Required]
        [DisplayName("Due Date")]
        public DateTime DueDate { get; set; }

        //------------------------------------------------------------
        [DisplayName("Due Time"), Required]
        public DateTime DueTime { get; set; }

这一切都有效,就像您 运行 localhost 上的页面时的功能一样——只要您在 time 字段中输入完整日期。但是输入会按原样进入数据库。

如何让表单在 time 字段中接受简单的时间?我使用什么数据类型?

.Net 框架没有内置 Time 类型,也没有内置 Date 类型。
它确实有 TimeSpan,但这与 Time 不同 - C# TimeSpan 实际上是一个持续时间 - 两个时间点之间的时间量 - 而 SQL服务器的 Time 数据类型实际上是一天中的时间 - 并且也是 documented 这样的:

Defines a time of a day. The time is without time zone awareness and is based on a 24-hour clock.

它的范围是 00:00:00.000000023:59:59.9999999

然而,.Net 的 TimeSpan 结构被记录为

Represents a time interval.

它的范围从 MinValueMaxValue 个字段,即

-10675199.02:48:05.477580810675199.02:48:05.4775807.

话虽如此,由于 .Net 框架没有 TimeOfDay 数据类型,它使用 TimeSpan 映射到 SQL 服务器的 Time 数据类型,您可以随意使用该数据类型来表示一天中的时间(这也是 DateTime 的结构 Time 属性 的类型,这意味着 .Net 框架本身使用此类型来表示一天中的时间。

如果您想要 .Net 的替代日期时间 api,您应该查看 NodaTime