Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当date在varchar中且数据库中没有分隔符时,如何搜索两个日期之间的记录?_C#_Sql_Sql Server_Vb.net - Fatal编程技术网

C# 当date在varchar中且数据库中没有分隔符时,如何搜索两个日期之间的记录?

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-使用

我在varchar列中存储了日期(我知道这是个坏主意),但没有日期依赖项。。以ddMMyyy格式<代码>示例:23-10-2013作为23102013存储在数据库中。现在,我想搜索两个特定日期之间的记录,例如
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
上的任何标记(由于转换)。另外,应该避免使用带有日期/时间/时间戳类型()的
介于
之间;这是使用了一种糟糕的排序格式(如果你试图在回答中指出这一点,恐怕还不完全清楚)。将变量作为整数进行比较可能也没有多大帮助(因为比较逻辑变得非常复杂)。唯一真正的解决方案是转换日期,希望是永久性的。这是我的第三个解决方案。。。。我注意到了。我想说的是,另外两个并没有真正的价值;这是使用了一种糟糕的排序格式(如果你试图在回答中指出这一点,恐怕还不完全清楚)。将变量作为整数进行比较可能也没有多大帮助(因为比较逻辑变得非常复杂)。唯一真正的解决方案是转换日期,希望是永久性的。这是我的第三个解决方案。。。。我注意到了。我想说的是,另外两个真的一文不值。