无法以更改的格式插入日期SQL

时间:2019-03-11 19:19:02

标签: sql-server tsql reporting-services

我有以下代码用于在SSRS中进行报告。

create table #tempdata(computer_name varchar(max),[Machine Type] varchar(max),Service_tag varchar(max),
[Operating System] varchar(max),
Computer_Model varchar(max), [Technical YES/NO] varchar(10),Manufacturer varchar(max),[SSD or HDD or null] varchar(max),
HDD_Size int,AD_site varchar(max),AD_Zone varchar(max), firstpowerondate date,FBODY varchar(max),manufacturer_date date,capacity int,
BIOS_version varchar(max),biosreleasedate date, BIOSY int,snapshotdate date)

--select * from SCCM_PCrefreshdata
insert into #tempdata
SELECT DISTINCT
v_R_System.Netbios_Name0 AS Computer_Name,
case
when v_GS_COMPUTER_SYSTEM.Model0 like '%Virtual%' then 'Virtual Machine'
when v_GS_COMPUTER_SYSTEM.Model0 like '%VM%' then 'Virtual Machine'
else 'Physical Machine'
End as 'Machine Type',
Tag0 as Service_Tag,
CASE
When Operating_System_Name_and0 like '%6.1%' then 'Windows 7'
When Operating_System_Name_and0 like '%6.3%' then 'Windows 8.1'
When Operating_System_Name_and0 like '%10%' then 'Windows 10'
END as 'Operating System',
v_GS_COMPUTER_SYSTEM.Model0 AS Computer_Model,
case
when v_GS_COMPUTER_SYSTEM.Model0 like '%precision%' and v_GS_COMPUTER_SYSTEM.manufacturer0 like '%dell%' then 'YES'
else 'NO' END as 'Technical YES/NO',
v_GS_COMPUTER_SYSTEM.manufacturer0 AS Manufacturer,
CASE
when v_GS_DISK.PNPDeviceID0 like '%SSD%' then 'SSD'
                when v_GS_DISK.Model0 like '%SanDisk%' then 'SSD'
                when v_GS_DISK.Model0 like '%hynix%' then 'SSD'
                when v_GS_DISK.Model0 like '%LITEON%' then 'SSD'
                when v_GS_DISK.Model0 like '%KINGSTON%' then 'SSD'
                when v_GS_DISK.Model0 like '%MICRON%' then 'SSD'
                when v_GS_DISK.Model0 like '%NVMe%Device%' then 'SSD'
                when v_GS_DISK.Model0 like '%Crucial%' then 'SSD'
                when v_GS_DISK.Model0 like '%TOSHIBA KSG60ZM%' then 'SSD'
                when v_GS_DISK.Model0 like '%TOSHIBA THNSNK%' then 'SSD'
                when v_GS_DISK.PNPDeviceID0 is null then 'null'
                else 'HDD' END as 'SSD or HDD or null',
HDISK.size0 AS HDD_Size,
[AD_Site],
[AD_Zone],
CHASSIS.FirstPowerOnDate0 as First_Power_On_Date,
CASE
When FirstPowerOnDate0 is null then '1900'
When FirstPowerOnDate0 like '%2011%' then '2011'
When FirstPowerOnDate0 like '%2012%' then '2012'
When FirstPowerOnDate0 like '%2013%' then '2013'
When FirstPowerOnDate0 like '%2014%' then '2014'
When FirstPowerOnDate0 like '%2015%' then '2015'
When FirstPowerOnDate0 like '%2016%' then '2016'
When FirstPowerOnDate0 like '%2017%' then '2017'
When FirstPowerOnDate0 like '%2018%' then '2018'
When FirstPowerOnDate0 like '%2019%' then '2019'
End as 'FPODY',
CHASSIS.ManufactureDate0 as Manufacturer_Date,
MEMORY.Capacity,
SMBIOSBIOSVersion0 As BIOS_VERSION,
ReleaseDate0 AS BIOS_RELEASE_DATE,
CASE
When ReleaseDate0 is null then '1900'
When ReleaseDate0 like '%2008%' then '2008'
When ReleaseDate0 like '%2009%' then '2009'
When ReleaseDate0 like '%2010%' then '2010'
When ReleaseDate0 like '%2011%' then '2011'
When ReleaseDate0 like '%2012%' then '2012'
When ReleaseDate0 like '%2013%' then '2013'
When ReleaseDate0 like '%2014%' then '2014'
When ReleaseDate0 like '%2015%' then '2015'
When ReleaseDate0 like '%2016%' then '2016'
When ReleaseDate0 like '%2017%' then '2017'
When ReleaseDate0 like '%2018%' then '2018'
When ReleaseDate0 like '%2019%' then '2019'
End as 'BIOSY',NULL
FROM [CM_CAS].[dbo].[v_R_System]
LEFT JOIN (
       SELECT ResourceID, Model0, FirstPowerOnDate0, ManufactureDate0, Tag0 FROM [CM_CAS].[dbo].[v_GS_DELL_DCIM_Chassis0] WHERE [CM_CAS].[dbo].[v_GS_DELL_DCIM_Chassis0].CreationClassName0 = 'DCIM_Chassis'
       ) as CHASSIS ON [CM_CAS].[dbo].[v_R_System].ResourceID = CHASSIS.[ResourceID]
LEFT JOIN [CM_CAS].[dbo].[v_GS_PC_BIOS] ON [CM_CAS].[dbo].[v_GS_PC_BIOS].ResourceID = [CM_CAS].[dbo].[v_R_System].ResourceID
LEFT JOIN (
       SELECT ResourceID, SUM(Capacity0) as Capacity From [CM_CAS].[dbo].[v_GS_PHYSICAL_MEMORY] GROUP BY ResourceID
       ) as MEMORY ON MEMORY.ResourceID = [CM_CAS].[dbo].[v_R_System].ResourceID
LEFT JOIN (
       SELECT ResourceID, size0 FROM [CM_CAS].[dbo].[v_GS_DISK]
        WHERE [v_GS_DISK].Name0 = '\\.\PHYSICALDRIVE0'
       ) as HDISK ON HDISK.ResourceID = [CM_CAS].[dbo].[v_R_System].ResourceID
LEFT JOIN (
       SELECT ResourceID FROM [CM_CAS].[dbo].[v_GS_LOGICAL_DISK] WHERE [v_GS_LOGICAL_DISK].Caption0 = 'c:'
       ) as LDISK ON [CM_CAS].[dbo].[v_R_System].ResourceID = LDISK.ResourceID
JOIN v_GS_DISK ON v_R_System.ResourceID = v_GS_DISK.ResourceID
JOIN totalrpt.AD_Computer ON totalrpt.AD_Computer.AD_name = v_R_System.Netbios_Name0
left JOIN v_GS_COMPUTER_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_System.ResourceID
WHERE Operating_System_Name_and0 NOT LIKE '%Server%'
and v_gs_disk.model0 not like '%usb%'
and v_gs_disk.model0 not like '%sdhc%' 
--and MEMORY.Capacity<8192 
--and BIOSY <2017
ORDER BY netbios_name0

create table #temp(computer_name varchar(max),[Machine Type] varchar(max),Service_tag varchar(max),
[Operating System] varchar(max),
Computer_Model varchar(max), [Technical YES/NO] varchar(10),Manufacturer varchar(max),[SSD or HDD or null] varchar(max),
HDD_Size int,AD_site varchar(max),AD_Zone varchar(max), firstpowerondate date,FBODY varchar(max),manufacturer_date date,capacity int,
BIOS_version varchar(max),biosreleasedate date, BIOSY int,snapshotdate date)
insert into #temp 
select * from #tempdata 

 declare @date as date
 set @date=replace(convert(NVARCHAR, getdate(), 111), ' ', '/')
update #temp set snapshotdate=@date


insert into SCCM_PCrefreshdata
select * from #temp 

drop table #temp
drop table #tempdata

我将日期更新为

   declare @date as date
     set @date=replace(convert(NVARCHAR, getdate(), 111), ' ', '/')
    update #temp set snapshotdate=@date

即使以以下格式更新了给定快照日期之后 2019-03-11,根据我要获取的SSR报告格式,是

enter image description here

所以我需要更改一种格式以获取数据库中的数据,它存储为“-”而不是“ /”

enter image description here

2 个答案:

答案 0 :(得分:1)

您对影响您的问题的Sql Server和SSRS中的日期有一些误解。

首先,您已将快照日期声明为日期:snapshotdate date。这意味着它在SQL Server中存储为日期类型列。您声明:

  

我需要yyyy-mm-dd格式的日期,即存储在数据库中的日期。

否,yyyy-mm-dd不是日期在数据库中的存储方式。日期实际上在Sql Server中存储为两个整数,一个是日期,另一个是时间。提取数据时,Sql Server Management Studio会以yyyy-mm-dd格式表示的日期字符串形式显示该数据,因为这两个整数对运行查询的人员没有任何意义,并且年月日优先级可以绕开由于国际日期格式不同,导致用户误解。

第二,使用以下转换将当前日期放入@date字段中:

declare @date as date
set @date=replace(convert(NVARCHAR, getdate(), 111), ' ', '/')

让我们忽略以下事实:转换类型111没有空格,因此您的replace函数是多余的,因为该格式已经是yyyy/mm/dd(没有空格)。您的公式从getdate()获取当前日期,将其转换为yyyy/mm/dd格式的字符串,执行多余的replace函数,得到与以前完全相同的字符串,表示日期为strng格式yyyy/mm/dd。然后-这是重要的一点-因为@date是日期而不是字符串,所以Sql Server会将您创建的字符串隐式转换回日期(如我们所讨论的,它不是日期)以yyyy/mm/dd的形式存储为字符串,但为两个整数)。

您无缘无故地进行了所有字符串转换。目前,您上面的公式与以下内容完全相同:

SET @date = GetDate()

第三,您将日期存储与日期显示混淆了。要在表中获取日期,您要做的就是将getdate()分配给snapshotdate,而不是NULL语句中当前在该位置的INSERT占位符。无需更新语句来更新snapshotdate,只需将其与其余数据一起插入即可,表中将存储正确的当前日期。

第四,演示文稿最好与存储区分开来,因此日期的显示方式与存储方式无关。 Sql Server Management Studio将其表示为yyyy-mm-dd,如果在此列中更新此字符串,则在数据库中更新该行时,它将隐式转换回日期类型。

SSRS将默认使用系统定义的短日期格式来显示日期-对于您来说,它看起来像MM/dd/yyyy hh:mm:ss tt。现在,如果要以不同的方式显示它,则只需要在表示层(SSRS)中以不同的方式设置其格式,而不用担心存储层(Sql Server)。

在表格单元格的属性中,有一个Format属性用于此目的。分配表格单元格,将其Value属性设置为snapshotdate,并将Format属性设置为yyyy-MM-dd,日期将以您想要的方式显示。

答案 1 :(得分:0)

您可以使用文本框属性在SSRS中更改日期格式,然后选择日期和所需的格式。它应该选择mm / dd / yyyy,但如果没有,则可以输入。