Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
Sql 如何仅从存储在varchar中的字符串中筛选日期_Sql_Sql Server - Fatal编程技术网

Sql 如何仅从存储在varchar中的字符串中筛选日期

Sql 如何仅从存储在varchar中的字符串中筛选日期,sql,sql-server,Sql,Sql Server,我以以下方式将值存储在SQL Server中:02-Jul-12 12:00:00 AM这里的时间和分、秒可以是任何类似于02-Jul-12 12 12:15:52 PM,02-Jul-12 6:02:12 AM的值 我希望有一个where条件,它将忽略时间,并根据如下日期获取数据where some_date='02-Jul-12' 我该怎么做 SELECT * FROM dbo.tbl_MyTable WHERE REPLACE(CONVERT(VARCHAR(9), Date

我以以下方式将值存储在SQL Server中:
02-Jul-12 12:00:00 AM
这里的时间和分、秒可以是任何类似于
02-Jul-12 12 12:15:52 PM
02-Jul-12 6:02:12 AM
的值

我希望有一个where条件,它将忽略时间,并根据如下日期获取数据
where some_date='02-Jul-12'

我该怎么做

 SELECT * FROM dbo.tbl_MyTable
    WHERE 
 REPLACE(CONVERT(VARCHAR(9), DateTimeValueColumn, 6), ' ', '-')='02-Jul-12'

在代码中的chage不是使用getdate函数voncet,而是使用datetime格式的datestring并进行比较。下面的查询将适用于您

SELECT * FROM dbo.tbl_MyTable
WHERE 
CAST(CONVERT(CHAR(10), DateTimeValueColumn, 102) AS DATE) = 
            CAST(CONVERT(CHAR(10),GETDATE(),102) AS DATE)

在代码中的chage不是使用getdate函数voncet,而是使用datetime格式的datestring并进行比较。下面的查询将适用于您

SELECT * FROM dbo.tbl_MyTable
WHERE 
CAST(CONVERT(CHAR(10), DateTimeValueColumn, 102) AS DATE) = 
            CAST(CONVERT(CHAR(10),GETDATE(),102) AS DATE)

如果您使用的是SQL2008或更高版本,则可以将
DATETIME
转换为
DATE

见此帖:

但在WHERE子句中,最好在日期之间搜索,如下所示:

DECLARE @startDate DATETIME = '02-Jul-2012'
DECLARE @endDate DATETIME = DATEADD(DAY, 1, @startDate)

SELECT * FROM [table] WHERE [some_Date] BETWEEN @startDate AND @endDate

如果您使用的是SQL2008或更高版本,则可以将
DATETIME
转换为
DATE

见此帖:

但在WHERE子句中,最好在日期之间搜索,如下所示:

DECLARE @startDate DATETIME = '02-Jul-2012'
DECLARE @endDate DATETIME = DATEADD(DAY, 1, @startDate)

SELECT * FROM [table] WHERE [some_Date] BETWEEN @startDate AND @endDate

如果将日期存储为字符(不推荐使用),则至少应使用ISO格式:YYYY-MM-DD hh:MM:ss。这使得日期对于排序和比较(“工作”、“工作之间”以及“相等”)非常有用

要提取日期,可以使用
left(datestr,10)
。在您的格式中,您将使用:

where left(datestr, 9) = '01-Jan-13'
如果将字段存储为
datetime
smalldatetime
,则可能认为它们存储为字符串。事实并非如此。它们存储为自某个特定日期起的天数,而日期部分存储为小数天。如果您使用的是SQL Server 2005或更高版本,那么最好的方法是:

where cast(datetime as date) = '2013-01-01'  -- I recommend ISO formats, even for constants.  '20130101' is even better

如果将日期存储为字符(不推荐使用),则至少应使用ISO格式:YYYY-MM-DD hh:MM:ss。这使得日期对于排序和比较(“工作”、“工作之间”以及“相等”)非常有用

要提取日期,可以使用
left(datestr,10)
。在您的格式中,您将使用:

where left(datestr, 9) = '01-Jan-13'
如果将字段存储为
datetime
smalldatetime
,则可能认为它们存储为字符串。事实并非如此。它们存储为自某个特定日期起的天数,而日期部分存储为小数天。如果您使用的是SQL Server 2005或更高版本,那么最好的方法是:

where cast(datetime as date) = '2013-01-01'  -- I recommend ISO formats, even for constants.  '20130101' is even better

选择具有今天日期(而非时间)的行的步骤


选择具有今天日期(而非时间)的行的步骤


不应为
datetime
字段使用字符串参数。存储在SQL Server中的数据是否位于varchar(或其他基于字符的)字段中?这是你的问题。在datetime字段中存储日期/时间。数据类型实际上是char/varchar还是datetime?如果它是varchar,而您不想将其更改为date,请使用像。。。我已将SQL置于应答器中。您不应该对
datetime
字段使用字符串参数。存储在SQL Server中的数据位于varchar(或其他基于字符的)字段中?这是你的问题。在datetime字段中存储日期/时间。数据类型实际上是char/varchar还是datetime?如果它是varchar,而您不想将其更改为date,请使用像。。。我已经把SQL放在一个答案里了,我没有否决你的答案。我总是感谢为回答这个问题所做的努力。当投反对票时,人们应该给出这样做的理由。我总是感谢为回答这个问题所做的努力。当向下投票时,人们应该给出这样做的理由。OP提到“日期”字段的类型为
varchar
。这对varchar(日期在OP中格式化时)适用。OP提到“日期”字段的类型为
varchar
。这对varchar(日期在OP中格式化时)适用