C# 当date在varchar中且数据库中没有分隔符时,如何搜索两个日期之间的记录?
我在varchar列中存储了日期(我知道这是个坏主意),但没有日期依赖项。。以ddMMyyy格式<代码>示例:23-10-2013作为23102013存储在数据库中。现在,我想搜索两个特定日期之间的记录,例如C# 当date在varchar中且数据库中没有分隔符时,如何搜索两个日期之间的记录?,c#,sql,sql-server,vb.net,C#,Sql,Sql Server,Vb.net,我在varchar列中存储了日期(我知道这是个坏主意),但没有日期依赖项。。以ddMMyyy格式示例:23-10-2013作为23102013存储在数据库中。现在,我想搜索两个特定日期之间的记录,例如2013年10月12日和2013年10月20日我是如何做到这一点的? 我正在使用SQL Server,我向您推荐3种解决方案。 1-更新列添加-例如:23052012-->23-05-2012您可以使用子字符串来达到目标,然后我将与比较运算符配合使用。 注意,它仅适用于dd-mm-yyyy 2-使用
2013年10月12日和2013年10月20日
我是如何做到这一点的?
我正在使用SQL Server,我向您推荐3种解决方案。
1-更新列添加-例如:23052012-->23-05-2012您可以使用子字符串来达到目标,然后我将与比较运算符配合使用。
注意,它仅适用于dd-mm-yyyy
2-使用子字符串将前两位数字分隔为day和其他数字,然后将整数与变量进行比较。
3-转换(日期,你的日期)我建议你3种解决方案。
1-更新列添加-例如:23052012-->23-05-2012您可以使用子字符串来达到目标,然后我将与比较运算符配合使用。
注意,它仅适用于dd-mm-yyyy
2-使用子字符串将前两位数字分隔为day和其他数字,然后将整数与变量进行比较。
3-转换(日期,您的日期)尝试以下方法:
SELECT *,
LEFT(CONVERT(VARCHAR, t.[parseddate], 120), 10) AS ParsedDate2
FROM (SELECT *,
CONVERT(DATETIME, Stuff(Stuff([startdate], 3, 0, '-'), 6, 0, '-')
, 105)
AS
ParsedDate
FROM mytable) AS t
WHERE t.[parseddate] BETWEEN '2013/10/10' AND '2013/10/20'
你可以看到它在工作
有关可用的日期和时间样式,请参阅此MSDN文章:
试试这个:
SELECT *,
LEFT(CONVERT(VARCHAR, t.[parseddate], 120), 10) AS ParsedDate2
FROM (SELECT *,
CONVERT(DATETIME, Stuff(Stuff([startdate], 3, 0, '-'), 6, 0, '-')
, 105)
AS
ParsedDate
FROM mytable) AS t
WHERE t.[parseddate] BETWEEN '2013/10/10' AND '2013/10/20'
你可以看到它在工作
有关可用的日期和时间样式,请参阅此MSDN文章:
您可以在
TSQL
中使用between
运算符,但我的日期存储为varchar格式,没有分隔符。。我认为这两者之间不起作用20092013
将大于19202013
,这是错误的……这就是为什么像这样存储日期是有问题的。如果您至少使用了yyyyMMdd
格式(不考虑分隔符),那么您就不需要转换它(即,查询可能会使用标记),但现在您已经注意到,db设计正在向您射击。更不用说您丢失了内置边界检查的事实……您可以在TSQL
中使用between
操作符,但我使用varchar格式存储了没有分隔符的日期。。我认为这两者之间不起作用20092013
将大于19202013
,这是错误的……这就是为什么像这样存储日期是有问题的。如果您至少使用了yyyyMMdd
格式(不考虑分隔符),那么您就不需要转换它(即,查询可能会使用标记),但现在您已经注意到,db设计正在向您射击。更不用说你已经丢失了内置的边界检查了……我必须说你的解决方案是简短、简单和甜蜜的,它太棒了!你我的朋友是天才!顺便问一下,我如何在最终结果集中显示日期为2013/10/10
或2013-10-10
。。还是一样。。你的解决方案很有效!但是如果我能在日期中插入分隔符来显示最终结果集,那就太好了!现在,您的解决方案显示存储在数据库中的日期,即不带分隔符的日期。请注意,这将无法使用startdate
上的任何标记(由于转换)。另外,应该避免在日期/时间/时间戳类型()中使用BETWEEN
!你我的朋友是天才!顺便问一下,我如何在最终结果集中显示日期为2013/10/10
或2013-10-10
。。还是一样。。你的解决方案很有效!但是如果我能在日期中插入分隔符来显示最终结果集,那就太好了!现在,您的解决方案显示存储在数据库中的日期,即不带分隔符的日期。请注意,这将无法使用startdate
上的任何标记(由于转换)。另外,应该避免使用带有日期/时间/时间戳类型()的介于之间;这是使用了一种糟糕的排序格式(如果你试图在回答中指出这一点,恐怕还不完全清楚)。将变量作为整数进行比较可能也没有多大帮助(因为比较逻辑变得非常复杂)。唯一真正的解决方案是转换日期,希望是永久性的。这是我的第三个解决方案。。。。我注意到了。我想说的是,另外两个并没有真正的价值;这是使用了一种糟糕的排序格式(如果你试图在回答中指出这一点,恐怕还不完全清楚)。将变量作为整数进行比较可能也没有多大帮助(因为比较逻辑变得非常复杂)。唯一真正的解决方案是转换日期,希望是永久性的。这是我的第三个解决方案。。。。我注意到了。我想说的是,另外两个真的一文不值。