我的日期格式如下:
Date_str
19-12-2007
31-7-2009
3-1-2010
31-11-2009
etc.
我不能做以下操作:
CONCAT(RIGHT(Date_str,4),SUBSTRING(Date_str,3,3),LEFT(2))
因为如上所述,日期的长度不同。SQL Server是否有办法将日期提取为DateTime/Date?
我也尝试了
Convert(datetime, Date_str)
,但它只是丢了一个错误:
将VARCHAR数据类型转换为DateTime数据类型的结果 在范围内的值中。
如果2012 ,我将使用try_convert((。这将返回伪造的日期为null。
示例
Declare @YourTable Table ([Date_str] varchar(50))
Insert Into @YourTable Values
('19-12-2007')
,('31-7-2009')
,('3-1-2010')
,('31-11-2009')
Select *
,try_convert(date,Date_Str,105)
from @YourTable
返回
Date_str (No column name)
19-12-2007 2007-12-19
31-7-2009 2009-07-31
3-1-2010 2010-01-03
31-11-2009 NULL -- Notice 11/31 is NOT a date
请参阅https://lealen.microsoft.com/en-us/sql/sql/t-sql/functions/cast-and-conervert-transact-transact-sql for Date Formats
您可能需要
CONVERT(DateTime, Date_str, 105)
正如我在评论中提到的那样,唯一现实的解决方案是将该字符串转换为适当的date
型列。当前格式不允许分类,或搜索一系列日期,例如在上周或一个日期和另一个日期之间找到条目。
用CONVERT
或TRY_PARSE
解析意味着不能使用索引来加快查询。每次:
WHERE CONVERT(Date, Date_str, 105) > '20170101'
使用,服务器将必须扫描整个表以转换数据,然后然后 过滤行。
如果您无法更改字段本身的类型,则可以创建一个持久的计算列,该列将值返回日期并添加索引。您将能够使用该列进行索引查询:
alter table SomeTable add date2 as TRY_convert(Actual_Date,date_str,105) PERSISTED
create index IX_SomeTable_ActualDate on SomeTable (Actual_Date)
这将使您无需技巧执行排序:
SELECT *
FROM SomeTable
ORDER BY Actual_Date
或运行范围的查询,以利用IX_Sometable_actualDate索引:
SELECT *
FROM SomeTable
Where Actual_Date Between DATEADD(d,-7,GETDATE()) AND GETDATE()
如果您有1000行,则可以获得1000倍的性能。
现有应用程序甚至不会注意到更改。较新的查询和应用程序将能够利用索引和排序
我也有类似的问题:我的列(< my_date_field>(的日期值的形式
2021-01
2021-02
2021-10
2021-12
等等,使用nvarchar的数据类型(4000(,然后我总是遇到Conversion failed when converting date and/or time from character string.
错误(尝试例如CAST(<my_date_field> AS DATE)
或CAST(CAST(<my_date_field> AS VARCHAR(7)) AS DATE)
等(
我能够将它们转换为以下代码:
SELECT
CONVERT(date, <my_date_field> + '-01') AS first_day_of_month
FROM my_table
导致
2021-08-01
2021-07-01
2021-06-01
2021-05-01