SQL Server中的LEFT函数不返回任何结果
我试图将对应于某个月的数据从SQL数据库放入临时表中SQL Server中的LEFT函数不返回任何结果,sql,sql-server,date,datetime,Sql,Sql Server,Date,Datetime,我试图将对应于某个月的数据从SQL数据库放入临时表中 DROP TABLE #ComPAIR_Alliance_Table SELECT IMOno ,period ,[service] ,alliances INTO #ComPAIR_Alliance_Table FROM com_COMPAIR.dbo.Data_BlueWaterCapacity_US_2 WHERE LEFT(period, 7) = '2015-03'
DROP TABLE
#ComPAIR_Alliance_Table
SELECT
IMOno
,period
,[service]
,alliances
INTO
#ComPAIR_Alliance_Table
FROM
com_COMPAIR.dbo.Data_BlueWaterCapacity_US_2
WHERE
LEFT(period, 7) = '2015-03'
SELECT
*
FROM #ComPAIR_Alliance_Table
期间字段的格式如下:2015-03-29 00:00:00.000
但是,我的代码只返回一个列名称正确但没有行的空临时表(尽管我确信表中存在具有该日期的行)。我已经使用is.numeric确保句点列确实是一个字符串
有人能帮我解决问题吗
谢谢 日期存储为日期类型。你可能想试试
where convert(varchar(20), period,121)
将其转换为字符串…如果它是日期/日期时间/日期时间2,则可以将其与
2015-03
进行比较,如:
WHERE period >= '2015-03-01'
AND preiod < DATEADD(MONTH, 1, '2015-03-01')
其中期间>='2015-03-01'
和前一个月<日期添加(2015-03-01年第1个月)
如有混淆:
- 上述日期将与2015年3月的所有日期相匹配,例如
,2015-03-31
和2015-03-31 23:59:59
2015-03-31 23:59:59.999999
- 上面是可搜索的:
部分不依赖于表行DATEADD
期间
是一个日期
。如果是,不要把它当作varchar
,它不是。如果您想要2015年3月的值,请执行以下操作:
WHERE period >= '20150301'
AND period < '20150401'
WHERE period>='20150301'
和期间<'20150401'
LEFT正在做一些奇怪的事情,因为LEFT导致从日期开始对字符串进行隐式转换。您可以查看更多信息,但您得到的正是您告诉SQL要获得的内容—一个行上的连接,其中周期的左7个字符等于“2015-03”,这是不会发生的,由于您喜欢与“Jan 01”之类的内容进行比较,LEFT
函数需要隐式地将您的datetime
列转换为varchar
值来完成它的工作。SQL Server正在根据其国际化设置选择日期的varchar
格式。在我的服务器上,它的2015年3月29日12:00AM
,和LEFT
产生3月29日
。这就是为什么它不等于2015-03
您应该将列视为datetime,然后使用有效的datetime比较执行比较,如下所示:
在“2015年1月1日”和“2015年1月31日”之间的期间是什么
期间的数据类型是什么?我打赌它是一个日期。句点是一个字符串列吗?还是日期/时间列?请注意,您的查询是不可搜索的。我还尝试使用年份(期间)=2019和月份(期间)=09,但这在您不使用的情况下都不起作用;t使用ISNUMERIC检查数据类型。查看表结构或类似的选择sql\u variant\u属性(句点,'basetype')
并防止使用索引?这是一个非常糟糕的主意。为什么这会被否决?这与Salman.A的解决方案相同,它们都是同时发布的。有人能解释一下吗?现在有两张反对票?我很想知道原因。如果有人需要在此处添加内容,请分享。:)虽然您的答案可以得到正确的结果,但它仍然依赖于语言环境,并依赖于语言设置。这种格式是一种更安全的选择: