【问题标题】:Getting Date only instead of date and time仅获取日期而不是日期和时间
【发布时间】:2015-04-25 17:14:16
【问题描述】:

好的,我已经对日期的差异进行了排序,效果很好。我现在面临的问题是,当我从日历中单击date(单击TextBox 时出现的AJAX 日历)时,它会将Datenull time 添加到数据库中。我只想要 Date 而不是 Time
请注意: AdmitDateDischargeDateDataType 设置为 datetime

这是我的 C# 代码:

string str = "update Patient set Department= @Department,Ward=@Ward,Bed=@Bed,Status=@Status,AdmitDate=@AdmitDate,DischargeDate=@DischargeDate, NumOfDays=@NumOfDays   where PID = '" + TextBox3.Text + "'";
        cmd = new SqlCommand(str, con);
        con.Open();
        cmd.Parameters.AddWithValue("@Department", DropDownList4.SelectedItem.Text);
        cmd.Parameters.AddWithValue("@Ward", DropDownList3.SelectedItem.Text);
        cmd.Parameters.AddWithValue("@Bed", DropDownList1.SelectedItem.Text);
        cmd.Parameters.AddWithValue("@Status", DropDownList2.SelectedItem.Text);
        cmd.Parameters.AddWithValue("@AdmitDate", TextBox1.Text);
        DateTime AdmitDate = DateTime.Parse(TextBox1.Text);
        // AdmitDate.ToString("d");
        AdmitDate.ToShortDateString();
        cmd.Parameters.AddWithValue("@DischargeDate", TextBox2.Text);
        DateTime DischargeDate = DateTime.Parse(TextBox2.Text);
        // DischargeDate.ToString("d");
        DischargeDate.ToShortDateString();
        var diff = (DischargeDate - AdmitDate).Days;
        cmd.Parameters.AddWithValue("@NumOfDays", diff);
        cmd.ExecuteNonQuery();
        con.Close();

如您所见,我尝试了 2 种方法,它们没有给出任何错误,但没有按应有的方式工作。我也尝试了其他一些事情(在此处和其他网站上提到),但它们也没有奏效。任何形式的帮助将不胜感激。 附加信息:我正在使用带有 VS2013 的 SQL Server 2008 R2。

编辑:这是我的 SQL 表结构:

CREATE TABLE [dbo].[Patient] (
[PID]           INT            IDENTITY (1, 1) NOT NULL,
[Department]    NVARCHAR (50)  NULL,
[Ward]          NVARCHAR (50)  NULL,
[Bed]           NVARCHAR (50)  NULL,
[Status]        NVARCHAR (50)  NULL,
[AdmitDate]     DATETIME       NULL,
[DischargeDate] DATETIME       NULL,
[NumOfDays]     INT            NULL,
CONSTRAINT [PK__Patient__C57755200BC6C43E] PRIMARY KEY CLUSTERED ([PID] ASC)

我已删除不相关的字段。

编辑:我的 gridview 代码:

<div id="mbody"> <br />
                <div class="gview"> 
                        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" HeaderStyle-HorizontalAlign="Center"  FooterStyle-HorizontalAlign="Center" CssClass="gview" DataKeyNames="PID" Width="613px">
                            <Columns>
                                <asp:CommandField ShowDeleteButton="True" />
                                <asp:BoundField DataField="PID" HeaderText="PID" SortExpression="PID" InsertVisible="False" ReadOnly="True" />
                                <asp:BoundField DataField="Pname" HeaderText="Pname" SortExpression="Pname" />
                                <asp:BoundField DataField="Gender" HeaderText="Gender" SortExpression="Gender" />
                                <asp:BoundField DataField="Department" HeaderText="Department" SortExpression="Department" />
                                <asp:BoundField DataField="Ward" HeaderText="Ward" SortExpression="Ward" />
                                <asp:BoundField DataField="Bed" HeaderText="Bed" SortExpression="Bed" />
                                <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" />
                                <asp:BoundField DataField="AdmitDate" HeaderText="AdmitDate" SortExpression="AdmitDate" />
                                <asp:BoundField DataField="DischargeDate" HeaderText="DischargeDate" SortExpression="DischargeDate" />
                                <asp:BoundField DataField="NumOfDays" HeaderText="NumOfDays" SortExpression="NumOfDays" />
                            </Columns>

                        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SMCConnectionString %>" SelectCommand="SELECT [PID], [Pname], [Gender], [Department], [Ward], [Bed], [Status], [AdmitDate], [DischargeDate], [NumOfDays] FROM [Patient]" DeleteCommand="DELETE FROM [Patient] WHERE [PID] = @PID" InsertCommand="INSERT INTO [Patient] ([Pname], [Gender], [Department], [Ward], [Bed], [Status], [AdmitDate], [DischargeDate], [NumOfDays]) VALUES (@Pname, @Gender, @Department, @Ward, @Bed, @Status, @AdmitDate, @DischargeDate, @NumOfDays)" UpdateCommand="UPDATE [Patient] SET [Pname] = @Pname, [Gender] = @Gender, [Department] = @Department, [Ward] = @Ward, [Bed] = @Bed, [Status] = @Status, [AdmitDate] = @AdmitDate, [DischargeDate] = @DischargeDate, [NumOfDays] = @NumOfDays WHERE [PID] = @PID">
                            <DeleteParameters>
                                <asp:Parameter Name="PID" Type="Int32" />
                            </DeleteParameters>
                            <InsertParameters>
                                <asp:Parameter Name="Pname" Type="String" />
                                <asp:Parameter Name="Gender" Type="String" />
                                <asp:Parameter Name="Department" Type="String" />
                                <asp:Parameter Name="Ward" Type="String" />
                                <asp:Parameter Name="Bed" Type="String" />
                                <asp:Parameter Name="Status" Type="String" />
                                <asp:Parameter Name="AdmitDate" Type="DateTime" />
                                <asp:Parameter Name="DischargeDate" Type="DateTime" />
                                <asp:Parameter Name="NumOfDays" Type="Int32" />
                            </InsertParameters>
                            <UpdateParameters>
                                <asp:Parameter Name="Pname" Type="String" />
                                <asp:Parameter Name="Gender" Type="String" />
                                <asp:Parameter Name="Department" Type="String" />
                                <asp:Parameter Name="Ward" Type="String" />
                                <asp:Parameter Name="Bed" Type="String" />
                                <asp:Parameter Name="Status" Type="String" />
                                <asp:Parameter Name="AdmitDate" Type="DateTime" />
                                <asp:Parameter Name="DischargeDate" Type="DateTime" />
                                <asp:Parameter Name="NumOfDays" Type="Int32" />
                                <asp:Parameter Name="PID" Type="Int32" />
                            </UpdateParameters>
                    </asp:SqlDataSource>

            </div>

【问题讨论】:

  • AdmitDate.ToShortDateString() 未分配给变量。
  • 为什么数据类型是日期时间而不是日期呢?如果您将日期时间指定为数据类型,则行为是正确的。
  • aaaaa 让我试试 summin,感谢您的指导。
  • @Amit 我也试过date,但效果还是一样。
  • 日期为sql表数据类型?

标签: c# sql asp.net sql-server date


【解决方案1】:

据我了解,您想保存 datetime 的唯一日期部分,您可以按以下方式进行操作:

    DateTime AdmitDate = DateTime.Parse(TextBox1.Text);
    cmd.Parameters.AddWithValue("@AdmitDate", AdmitDate.ToShortDateString());
    DateTime DischargeDate = DateTime.Parse(TextBox2.Text);
    cmd.Parameters.AddWithValue("@DischargeDate", DischargeDate.ToShortDateString());

在您的代码中,您没有将 ToShortDateString() 值分配给任何未反映更改的内容。

并且您可能希望更改查询以使用 parametrized 值以避免 SQL 注入。 Here is more info on it

string str = "update Patient set Department = @Department, Ward = @Ward, Bed = @Bed, Status = @Status, AdmitDate = @AdmitDate, DischargeDate = @DischargeDate, NumOfDays = @NumOfDays where PID = @PID";
cmd.Parameters.AddWithValue("@PID", TextBox3.Text);

更新

从您的 cmets 来看,您在 UI 中显示的日期很明显是显示时间,因为您需要确保在将值设置为 UI 控件之前将其转换为仅日期。

如果您可以完全控制表格并且您永远不想存储时间,那么最终的解决方案是将DateTime 更改为Date

在这种情况下,当您获取它并将其存储在 DateTime 类型变量中时,它将向其中添加 Time 部分。因此,您必须先应用 .ToShortDateString(),然后再将其分配给 UI 控件。

更新

要更改 UI,您需要放置日期列的 boundfieldDataformatString 属性。在这 2 行的网格视图中,添加 DataformatString 属性,其值为 {0:MM/dd/yyyy}

    <asp:BoundField DataField="AdmitDate" HeaderText="AdmitDate" SortExpression="AdmitDate" DataFormatString="{0:MM/dd/yyyy}"/>
    <asp:BoundField DataField="DischargeDate" HeaderText="DischargeDate" SortExpression="DischargeDate" DataFormatString="{0:MM/dd/yyyy}"/>

【讨论】:

  • 谢谢,这就是我得到的。我认为它不会在其他任何地方使用。 link
  • 您正在多次设置"@AdmitDate"。这就是错误的原因。
  • 仍然没问题,修复了错误,但这就是我仍然得到它的方式:link
  • 在 UI 上显示结果时添加时间。您应该检查从数据库中获取数据并显示在 UI 上的代码。
  • ToShortDateString() 是文化敏感的,因此 SQL Server 可能无法按您的预期转换它。考虑 2015 年 4 月 5 日的日期,在某些国家/地区是 4 月 5 日,但在其他国家/地区(如保加利亚)是 5 月 4 日,因此为了准确起见,您可以执行 .ToString("yyyy-mm-dd");
【解决方案2】:

如果您只想将日期部分存储在数据库中,则使用列的数据类型作为日期。

例如-

DECLARE @date1 date= '02-24-15 23:20:51'; -- will take only the date  
SELECT @date1 AS 'date1'

会有-

date1
--------------
2015-02-24

编辑-

根据您的版本和表格结构,我运行了简单的测试,它工作正常。

CREATE TABLE #Patient (
[PID]           INT            IDENTITY (1, 1) NOT NULL,
[Department]    NVARCHAR (50)  NULL,
[Ward]          NVARCHAR (50)  NULL,
[Bed]           NVARCHAR (50)  NULL,
[Status]        NVARCHAR (50)  NULL,
[AdmitDate]     Date       NULL,
[DischargeDate] Date       NULL,
[NumOfDays]     INT            NULL
);

Insert into #Patient Values('ABC','Ward1','Bed2','Active','02-24-15 23:20:51','02-26-15 23:20:51',2);

Select * from #Patient;

结果-

PID         Department                                         Ward                                               Bed                                                Status                                             AdmitDate  DischargeDate NumOfDays
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------- ------------- -----------
1           ABC                                                Ward1                                              Bed2                                               Active                                             2015-02-24 2015-02-26    2

如果您检查我将日期时间数据类型修改为日期

    [AdmitDate]     Date       NULL,
    [DischargeDate] Date       NULL,

【讨论】:

  • 您共享的结构的数据类型是日期时间。通过更改表将其更改为日期。另外,您是否连接到正确的 SQL Server 和 DB?另外,使用 Date.TryParseExact 而不是 Date.Parse。
  • 你试过 Date.TryParseExact 吗?您为 CalenderExtender 设置的格式是什么?
  • 如果你把调试断点放在行 cmd.Parameters.AddWithValue("@AdmitDate", TextBox1.Text);您为 TextBox1.Text 获得的价值是多少?
  • 我尝试了DateTime.TryParseExact 方法,这是我得到的:link
【解决方案3】:

根据:

AdmitDate 和 DischargeDate 的 DataType 设置为 datetime。

您不能只在这些列中插入日期部分。如果您尝试过,它会自动将时间保存为 12:00 AM(一天的开始时间)。

如果您真的只想插入日期,则将列数据类型更改为日期。

ALTER TABLE table_name
ALTER COLUMN column_name datatype

见:Alter_Table_datatype

【讨论】:

  • 在日期列值保存为日期时间??@Sana Qureshi
  • 那就是魔法,尽情享受吧。 :P
  • 最后:“它仍然给时间部分”是什么意思?你在 Sql-Query 窗口中尝试过吗? "select date_colum from tbl_name" 你也得到了时间部分??
【解决方案4】:

DateTime AdmitDate = DateTime.Parse(TextBox1.Text);

字符串 admissionDate = AdmitDate.Date; // 它只给你日期

如果您只需要 SQL SERVER 中的日期,则意味着您需要将列的数据类型从 datetime 更改为 date。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多