我在日志数据库中有一个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 |
|---------------------|
第2版:通过进一步的测试,我能够进一步缩小错误范围。这并不是因为最初假设的时间戳,它没有时间信息。该问题实际上影响了不符合要求的记录。
这些数据记录缺少月份的前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
函数(使用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)