如何解决将varchar转换为缺少时间的datetime时,按结果排序超出范围
我在日志数据库中有一个varchar
行,该行通常看起来像17.09.2020 00:00:01
,我可以将CAST()
移到datetime
并按顺序进行排序,例如这个简化的查询:
SELECT CAST(my_date_and_time AS datetime)
FROM my_table
ORDER BY CAST(my_date_and_time AS datetime) DESC
现在的问题是,今晚我在00:00:00正好有一个日志条目,并且日志记录脚本或数据库缩短了varchar
字段的时间,所以现在它仅包含17.09.2020
而非17.09.2020 00:00:00
。
当我尝试将其强制转换为datetime
时,会导致超出范围的错误,可能是因为缺少时间部分吗?
不幸的是,我无权访问日志记录脚本以在那里进行更改。 那么有什么方法可以在查询中将其转换为可用的格式?
编辑:以下是my_date_and_time行的示例:
|---------------------|
| my_date_and_time |
|---------------------|
| 17.09.2020 05:29:53 |
|---------------------|
| 17.09.2020 00:02:11 |
|---------------------|
| 17.09.2020 |
|---------------------|
| 16.09.2020 23:59:38 |
|---------------------|
| 16.09.2020 23:59:18 |
|---------------------|
EDIT2 :通过进一步的测试,我能够进一步缩小错误范围。这不是因为最初假定的时间戳,它没有时间信息。该问题实际上会影响不符合要求的记录。
这些数据记录在月份中缺少前面的0,而在年份之后又少了一个点。
例如16.9.2020. 14:22:23
我快要把编程这个程序的人都扯下来了。.
有没有办法通过查询获得正确的值?
很抱歉造成误会,并感谢迄今为止为解决问题做出贡献的每个人
解决方法
正如我在评论中提到的那样,实际上您应该修复数据类型。
如果您所有的日期都是,格式为dd.MM.yyyy hh:mm:ss
,则无论设置如何,都可以使用CONVERT
和样式代码进行转换:
SELECT TRY_CONVERT(datetime,Your_varchar,103)
FROM dbo.YourTable;
如果有任何返回值NULL
,则它们的值为NULL
,或者转换失败。
但是回到修复数据上。
首先,让我们在新列中进行此操作:
ALTER TABLE dbo.YourTable ADD Actual_date_and_Time datetime NULL
现在我们可以通过覆盖该值来UPDATE
:
UPDATE dbo.YourTable
SET Actual_date_and_Time = TRY_CONVERT(datetime,Varchar_Date_and_time,103);
然后,您可以查询实际的datetime
列。
然后您可以查看新数据,看看是否有问题,然后进行修改:
SELECT Varchar_Date_and_time
FROM dbo.YourTable
WHERE Varchar_Date_and_time IS NOT NULL
AND Actual_date_and_Time;
然后,最后,您可以DROP
旧列并重命名新列(如果需要):
ALTER TABLE dbo.YourTable DROP COLUMN Varchar_Date_and_time;
EXEC sys.sp_rename N'dbo.YourTable.Actual_date_and_Time',N'Varchar_Date_and_time','COLUMN';
,
让我们尝试convert
函数(Date and Time Conversions Using SQL Server):
declare @my_date_and_time varchar(19) = '17.09.2020 00:00:01';
select convert(date,@my_date_and_time,104)
或尝试将dateformat
设置为dmy
(天/月/年):
set dateformat dmy
declare @my_date_and_time varchar(19) = '17.09.2020 00:00:01';
select cast(@my_date_and_time as date)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。