为什么 t-SQL 按日期时间排序在 SQL SMS 中正确但在 ASP Classic 输出中不正确?

Why is t-SQL order by datetime correct in SQL SMS but not in ASP Classic output?

在 T-SQL 中查询下面的 select 时,输出按应有的顺序排列,但是当我在经典 ASP 中使用 select 时,顺序排序不正确:

SELECT ChangeDate, ID, DataString, Operation, Area, ChangedBy
FROM EFP_LOG
WHERE Operation = 'Created'
ORDER BY ChangeDate DESC;

SQL Server Management Studio 中的输出是:

2021-06-06 21:13:17.177
2021-05-31 15:46:38.603
2021-05-31 15:43:21.967
2021-05-31 15:42:02.987
2021-05-31 15:41:44.493
...

Classic ASP 中的输出是(输出格式正确显示:DD-MM-YYYY hh.mm.ss):

05-05-2021 21:33:54
05-05-2021 21:41:52
05-05-2021 21:43:46
05-05-2021 21:45:35
06-06-2021 21:13:17
07-04-2021 07:39:03
...

标签布局:

----------------------------------------------------------------------------
| PRIMARY KEY | COLUMN NAME   | DATA TYPE     | ALLOW NULL | DEFAULT VALUE |
----------------------------------------------------------------------------
|   YES       | ID            | int           | NO         | Identity (1,1)|
|             | DataString    | VARCHAR(8000) | YES        |               |
|             | Operation     | VARCHAR(255)  | YES        |               |
|             | Area          | VARCHAR(255)  | YES        |               |
|             | ChangedBy     | VARCHAR(255)  | YES        |               |
|             | ChangeDate    | datetime      | NO         | GetDate()     |
|             | ADdisplayName | VARCHAR(255)  | YES        |               |
|             | ADMail        | VARCHAR(255)  | YES        |               |
|             | ADCompany     | VARCHAR(255)  | YES        |               |
|             | ADdepartment  | VARCHAR(255)  | YES        |               |
|             | ADtitle       | VARCHAR(255)  | YES        |               |

我尝试了几种使用 FORMAT、CAST 和 CONVERT 的方法,但其中 none 有效,可能是什么问题?

更新为ASP代码:

<%

    Set UserCreationLogConn = Server.CreateObject("ADODB.Connection")
    UserCreationLogConn.ConnectionString="Provider=SQLOLEDB; DATA SOURCE=<SERVER>;UID=SA;PWD=<PASSWORD>;DATABASE=<DATABASE>"
    UserCreationLogConn.Open

    UserCreationLogSQL = "SELECT ChangeDate, ID, DataString, Operation, Area, ChangedBy, ADmail, ADcompany, ADdepartment, ADtitle FROM EFP_LOG WHERE Operation = 'Created' ORDER BY ChangeDate DESC;"

    Set objUserCreationLog = UserCreationLogConn.Execute(UserCreationLogSQL)

    While Not objUserCreationLog.EOF

      Response.Write objUserCreationLog("ChangeDate")

    objUserCreationLog.MoveNext

    Wend
    objUserCreationLog.Close
    Set objUserCreationLog = Nothing
 %>

SQL 从 SMS 创建到的输出:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[EFP_LOG](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DataString] [varchar](8000) NULL,
    [Operation] [varchar](255) NULL,
    [Area] [varchar](255) NULL,
    [ChangedBy] [varchar](255) NULL,
    [ChangeDate] [datetime] NOT NULL,
    [ADdisplayName] [varchar](255) NULL,
    [ADmail] [varchar](255) NULL,
    [ADcompany] [varchar](255) NULL,
    [ADdepartment] [varchar](255) NULL,
    [ADtitle] [varchar](255) NULL,
 CONSTRAINT [PK_EFP_LOG] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[EFP_LOG] ADD  CONSTRAINT [DF__EFP_LOG__ChangeD__4A0FA628]  DEFAULT (getdate()) FOR [ChangeDate]
GO

问题是使用 DataTables、查询和返回的日期时间列被视为文本字符串,因为它无法确定我的本地化。

检查此页面后的解决方案 https://datatables.net/reference/option/columns.type 是将下面的 columnDefs 添加到数据表

$('#dtBasicExample').dataTable( {
  "language": {
      "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Danish.json"
  },
  "columnDefs": [
    { "type": "date", "targets": 0 }
  ]
 
} );