Good question. You have to put a number regarding the colour of the block after the name. For example:
/give @p minecraft:wool would give you white wool
/give @p minecraft:concrete 4 would give you yellow concrete etc.
These codes can be used for any block/entity with a colour code such as beds and wool. Here are the list of colours:
0 White 1 Orange 2 Magenta 3 Light Blue 4 Yellow 5 Lime 6 Pink 7 Grey 8 Light Grey 9 Cyan 10 Purple 11 Blue 12 Brown 13 Green 14 Red 15 Black
If you press F3 + H in-game, it will show the data values of each block so when you hover over a coloured block, it will say the number after it.
Seriously... you seems you don't answer my first question
In Adventure mode
1. I got a yellow concrete with NBT tag CanPlaceOn stonebrick. I put it on a stone brick. Then, I break the yellow concrete block with diamond pickaxe that has NBT tag CanDestroy tile.concrete.name . But it seems to be appeared that there are no NBT tag on yellow concrete block.
Q: How can I get the NBT tag CanPlaceOn stonebrick without typing the command (it means by using command block) or without changing the gamemodes?
You can't really keep tags on blocks. Once you destroy a block it basically drops and by doing so transforms into an Item entity. And an entity has a completely different set of properties than a block. Then, when you pick it up again it'll transform back into a block.
Therefor it's not possible to retain tags and other markers on blocks.
As to the CanPlaceOn property, to my knowledge you cannot add differences in block types. CanPlaceOn requires one single string: a block id. Also see the block tags section on the players.dat wiki page. So you can tell it that it can be placed on wool, but you can't specifically define it as green wool. But that will eventually be possible when version 1.13 comes out.