仅获取日期而不是日期和时间
Getting Date only instead of date and time
好的,我已经对日期的差异进行了排序,效果很好。我现在面临的问题是,当我从日历中单击 date
时(单击 TextBox
时出现的 AJAX 日历)它添加 Date
以及 null time
到数据库。我只想要 Date
而不是 Time
.
请注意: AdmitDate
和 DischargeDate
的 DataType
设置为 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 种方法,它们没有给出任何错误,但没有按照预期的方式工作。我也尝试了一些其他的东西(在这里和其他网站上提到过)但它们也没有用。任何形式的帮助将不胜感激。
附加信息:我正在使用 SQL 服务器 2008 R2 和 VS2013。
编辑:这是我的 SQL table 结构:
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>
据我了解,您想保存 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);
更新
从您的评论中可以清楚地看出,您在 UI 中显示的日期显示的是时间,因为您需要确保在将值设置为 UI控制。
或
如果您可以完全控制表格并且永远不想存储时间,那么最终的解决方案是将 DateTime
更改为 Date
。
在这种情况下,当您获取它并且将其存储在 DateTime
类型变量中时,它将向其中添加 Time
部分。因此,您必须在将 .ToShortDateString()
分配给 UI 控件之前应用它。
更新
要更改 UI,您需要将日期列的 DataformatString 属性 放入 boundfield
。在您的 gridview 中为这两行添加 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}"/>
如果您只想将日期部分存储在数据库中,则使用列的数据类型作为日期。
例如-
DECLARE @date1 date= '02-24-15 23:20:51'; -- will take only the date
SELECT @date1 AS 'date1'
会有-
date1
--------------
2015-02-24
编辑-
从你的版本和 table 结构我 运行 简单测试,它工作正常。
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,
根据 :
the DataType of AdmitDate and DischargeDate is set to datetime.
您不能只向这些 column.if 插入日期部分,您尝试过,它会自动将时间保存为 12:00 AM(当天的开始时间)。
如果您真的只想插入日期,请将列数据类型更改为日期。
ALTER TABLE table_name
ALTER COLUMN column_name datatype
日期时间 AdmitDate = DateTime.Parse(TextBox1.Text);
字符串 admitDate = AdmitDate.Date; // 它只给你 Date
如果您只想要 SQL SERVER 中的日期,则意味着您需要将列的数据类型从 datetime 更改为 date。
好的,我已经对日期的差异进行了排序,效果很好。我现在面临的问题是,当我从日历中单击 date
时(单击 TextBox
时出现的 AJAX 日历)它添加 Date
以及 null time
到数据库。我只想要 Date
而不是 Time
.
请注意: AdmitDate
和 DischargeDate
的 DataType
设置为 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 种方法,它们没有给出任何错误,但没有按照预期的方式工作。我也尝试了一些其他的东西(在这里和其他网站上提到过)但它们也没有用。任何形式的帮助将不胜感激。 附加信息:我正在使用 SQL 服务器 2008 R2 和 VS2013。
编辑:这是我的 SQL table 结构:
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>
据我了解,您想保存 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);
更新
从您的评论中可以清楚地看出,您在 UI 中显示的日期显示的是时间,因为您需要确保在将值设置为 UI控制。
或
如果您可以完全控制表格并且永远不想存储时间,那么最终的解决方案是将 DateTime
更改为 Date
。
在这种情况下,当您获取它并且将其存储在 DateTime
类型变量中时,它将向其中添加 Time
部分。因此,您必须在将 .ToShortDateString()
分配给 UI 控件之前应用它。
更新
要更改 UI,您需要将日期列的 DataformatString 属性 放入 boundfield
。在您的 gridview 中为这两行添加 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}"/>
如果您只想将日期部分存储在数据库中,则使用列的数据类型作为日期。
例如-
DECLARE @date1 date= '02-24-15 23:20:51'; -- will take only the date
SELECT @date1 AS 'date1'
会有-
date1
--------------
2015-02-24
编辑-
从你的版本和 table 结构我 运行 简单测试,它工作正常。
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,
根据 :
the DataType of AdmitDate and DischargeDate is set to datetime.
您不能只向这些 column.if 插入日期部分,您尝试过,它会自动将时间保存为 12:00 AM(当天的开始时间)。
如果您真的只想插入日期,请将列数据类型更改为日期。
ALTER TABLE table_name
ALTER COLUMN column_name datatype
日期时间 AdmitDate = DateTime.Parse(TextBox1.Text);
字符串 admitDate = AdmitDate.Date; // 它只给你 Date
如果您只想要 SQL SERVER 中的日期,则意味着您需要将列的数据类型从 datetime 更改为 date。