【问题标题】:filter datetime based on date in different format根据不同格式的日期过滤日期时间
【发布时间】:2014-02-03 04:27:43
【问题描述】:

我想通过将 sql server 中 datetime 类型的日期时间列与日期文本框进行比较来过滤 gridview


sql server 中的 datetime 列以 yyyy-mm-dd hh:mm:ss.sss 格式存储/显示(默认)。

但是日期文本框的格式为 dd/mm/yyyy。

<asp:TextBox ID="date_tb" runat="server" TextMode="Date"></asp:TextBox>


我尝试使用 FilterExpression="CONVERT(VARCHAR, [ScheduledDateTime], 105) LIKE '%{0}%'"> 但它没有用。

FilterExpression="CONVERT([ScheduledDateTime], 'System.String', 105) LIKE '%{0}%'"> 也没有用。


然后我尝试使用

SelectCommand="SELECT [ScheduledDateTime], CONVERT(VARCHAR, [ScheduledDateTime], 105) as d ... FROM table1

FilterExpression="d LIKE '%{0}%'">

但效果不佳。



编辑:

我已将ControlParameter 更改为<asp:ControlParameter Name="ScheduledDateTime" ControlID="date_tb" PropertyName="Text" type="DateTime"/>,因此我不再需要担心日期格式。

虽然现在比较 datedatetime 存在问题。

【问题讨论】:

  • 日期时间以二进制形式存储 - 它们不以任何“格式”存储
  • 试试这个:FilterExpression="Cast([ScheduledDateTime] as Date)='{0}'"。但这不是很酷的原因是(我相信)它需要您的 SQL Server 在英国规则下运行。这就是为什么 CAST 更好,因为它可以在任何地方工作
  • @T.S.该表达式包含未定义的函数调用 cast()。
  • @j_t_fusion:抱歉,在上一篇文章中,我的意思是更好地转换,因为不用担心 Sql Server 的本地化。在我的服务器上这有效:where cast(a as date) = '03/24/2013'.
  • @j_t_fusion:你是对的。我们在这里所做的对您不起作用,因为您使用的是 SqlDataSource。它仅限于某些过滤集。您不能在此处调用 Sql Server 函数 - 它再次用于数据行集合,而不是 Sql Server Db。试试这个:FilterExpression="[ScheduledDateTime] > <Your date - 1> And [ScheduledDateTime] < <Your date + 1>。这应该是肯定的

标签: asp.net sql sql-server vb.net datetime


【解决方案1】:

您无需进行任何字符串转换即可在 SQL 中比较 DateTimes。当您使用LIKE 时,SQL 会将 DateTime 转换为字符串值,您需要确保在两端使用相同的格式。如果您的源数据不包含任何时间组件,那么您应该能够:

FilterExpression="ScheduledDateTime = {0}"

如果它确实包含时间组件并且您想截断时间,您可以尝试:

FilterExpression="dateadd(dd, datediff(dd,0, ScheduledDateTime ), 0) = {0}"

FilterExpression="ScheduledDateTime BETWEEN {0} AND dateadd(dd, 1, {0})"

【讨论】:

  • 我相信BETWEEN {0} AND dateadd(dd, 1, {0}) 在逻辑上是不正确的。您可能希望在日期减去所有分钟小时等和日期 + 最大小时、分钟等之间获取日期
  • 表达式包含未定义的函数调用 dateadd()。
【解决方案2】:

这是你可以做的

select * from MyTable where convert(varchar, a, 103) = '03/24/2013'

您可能不想将日期与秒数进行比较。等式右边来自文本框

如果你想要它真的很好,那就这样做

Dim sql as String = "select * from MyTable where convert(varchar, a, 103) = @1"

@1 是您要添加到Command Object 的参数,它将具有您的文本框的值。

【讨论】:

  • 我正在使用FilterExpression,所以我不知道它是如何工作的。
  • 我的回答显示了 SQL 服务器对日期比较的反应。如果你注意到,我有美国格式 - 101。我刚刚注意到,你需要 103 来表示 dd/mm/yyyy
  • 不要通过将日期转换为字符串来比较日期。将它们本地作为日期进行比较。
  • 错了!在 UI 上,您有 dd/mm/yyyy。在 Db 中,您有很长的数字,包括小时、分钟、秒、毫秒。您需要将它们转换为通用数据。您无法将 UI 内容转换为毫秒。
  • 据我所知,FilterExpression 仅适用于字符串,这就是我将它们转换为字符串的原因。
【解决方案3】:

http://msdn.microsoft.com/en-us/library/ms187928.aspx

使用格式 103 将 'dd/mm/yyyy' 字符串转换为日期。您使用的是 105,即 'dd-mm-yyyy'

【讨论】:

  • 很抱歉,我只是不明白使用格式 103 是如何工作的。
  • 当您声称“sql server 中的日期时间以 yyyy-mm-dd hh:mm:ss.sss 格式存储(默认)”时,您能解释一下您的意思吗?数据库架构是使用datetime 类型还是varchar 类型?
  • db 中的 datetime 列是 datetime 类型。默认情况下,这些值以 yyyy-mm-dd hh:mm:ss.sss 格式存储/显示在数据库中。因此,如果我直接从datetime 转换为varchar,输出将类似于2014-12-31 18:22:33:234
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2023-03-29
相关资源
最近更新 更多