日期是SQL Server中连字符之间的字符串



我的日期格式如下:

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型列。当前格式不允许分类,或搜索一系列日期,例如在上周或一个日期和另一个日期之间找到条目。

CONVERTTRY_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

最新更新